Spring boot에서 RestTemplate를 사용하여 OpenAPI를 사용하던 중 1. return
되는 값이 너무 많았고, OpenAPI의 2. retrun
값의 Content-Type이application/json
이 아닌 text/plain; charset=utf-8
였다.
전에 사용했던 방식은 Json
형태라 항상 return값과 완전히 같은 Class를 만들고 retTemplate.getForObject()
로 받아 사용하였다.
이렇게 만들게 되면 필요없는 값들까지 다 Class의 멤버변수로 명시해주어야 하는데 너무 값이 많으면 유지보수도 힘들고 굳이 그럴 필요는 없겠다 생각하여 필요한 값들만 명시해보니 오류가 발생했다.
return
값에서 매핑될 값이 없다는 오류 같았다.
@JsonIgnoreProperties(ignoreUnknown = true)
이 어노테이션을 받아올 객체 Class에 명시하면 해결된다. @JsonIgnoreProperties(ignoreUnknown = true)
@Data
public class ABookInfo {
private String title;
private String link;
...
}
text/plain
타입으로 리턴이 되면 retTemplate.getForObject()
방식을 사용하여 파싱이 안되는 문제가 발생했다.
일단 String
타입으로 값을 받은 후, ObjectMapper
를 사용하여 이를 위에 생성한 객체로 변경하였다.
// 아래 두줄은 이상이 없다.
ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
log.info("response : {}", response);
// ObjectMapper에서 에러 발생
ReturnResponse returnResponse = objectMapper.readValue(response.getBody(), ReturnResponse.class);
log.info("object mapper : {}", returnResponse);
에러 발생..
com.fasterxml.jackson.databind.JsonMappingException: Unrecognized character escape ''' (code 39)
내가 생각했을땐 response값의 빽슬래쉬 등등이 Json
타입과 맞지 않아 ObjectMapper
가 정상적으로 객체로 파싱하지 못하는? 것 같다.
구글링 끝에 방법을 찾았다.
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(JsonReadFeature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER.mappedFeature(), true);
ObjectMapper
를 생성할때 옵션을 주면 해결된다. return
값이 어떠한 문자가 섞여 오는가에 따라 여러가지 옵션을 주면 된다.
ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER
,ALLOW_UNESCAPED_CONTROL_CHARS
등을 추가하였다.