기존 소스에 XML 형태로 받을 수 있도록 수정
URI uri = new URI(urlBuilder.toString());
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<ApiResponse> responseEntity = restTemplate.getForEntity(uri, ApiResponse.class);
return responseEntity.getBody();
URI uri = new URI(urlBuilder.toString());
RestTemplate restTemplate = new RestTemplate();
if ( areaVo.getDataType().equalsIgnoreCase("XML") ){
ResponseEntity<String> apiResponseEntity = restTemplate.getForEntity(uri, String.class); // api 연동한 response 값을 String 타입으로 받아옴.
String responseEntityString = apiResponseEntity.getBody(); // String 타입의 response
// JAXB에서 제공하는 언마샬링 메소드
JAXBContext jaxbContext = JAXBContext.newInstance(Response.class); // Response 타입으로 변경
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
// unmarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// 입력 -> 출력
Response response = (Response) unmarshaller.unmarshal(new StringReader(responseEntityString));
ApiResponse apiResponse = new ApiResponse();
apiResponse.setResponse(response);
return apiResponse;
}
ResponseEntity<ApiResponse> apiResponseEntity = restTemplate.getForEntity(uri, ApiResponse.class);
return apiResponseEntity.getBody();
}
1. API 연동 결과 값을 XML 형태료 변경
ResponseEntity<String> apiResponseEntity = restTemplate.getForEntity(uri, String.class); // api 연동한 response 값을 String 타입으로 받아옴.
String responseEntityString = apiResponseEntity.getBody(); // String 타입의 response
// JAXB에서 제공하는 언마샬링 메소드
JAXBContext jaxbContext = JAXBContext.newInstance(Response.class); // Response 타입으로 변경
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
// unmarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// 입력 -> 출력
Response response = (Response) unmarshaller.unmarshal(new StringReader(responseEntityString));
getForEntity를 통해 해당 uri에 대한 결과 api 연동 결과 값을 받지만, JSON 형태로 받을 수는 있어도 XML 형태로 받는 것은 지원해주지 않다보니 우선 Object를 String 타입으로 받는다.
JAXBContext, unmarshall를 이용해서 XML 형태로 변경한다.
2. 반환 타입
public ApiResponse weatherResponse(final AreaVo areaVo) throws Exception {
···
if ( areaVo.getDataType().equalsIgnoreCase("XML") ) {
···
Response response = (Response) unmarshaller.unmarshal(new StringReader(responseEntityString));
ApiResponse apiResponse = new ApiResponse();
apiResponse.setResponse(response);
return apiResponse;
}
···
}
unmarshall한 Response 타입의 결과 값을 반환하려고 하니 메소드의 반환 타입과 맞지 않았다.
@Data
public class ApiResponse
{
private Response response;
}
그래서 ApiResponse 클래스가 VO이기 때문에 새로 객체를 생성해서 그 안에 Response 값을 담아 ApiResponse 타입으로 반환하는 것으로 해결했다.