본문 바로가기
IT/Spring

[Spring][Error] ObjectMapper의 readValue시 Unrecognized field "promt_filter_results"

by 강천구 2024. 1. 19.

Spring에서 API 호출 이후 응답에 대해 ObjectMapper를 이용하여 HttpEntity<String>의 body를 특정 Class에 값을 매핑시켜 사용 하고 있다.

// 기존 응답 예시
{
	"id": "1201204567",
    "model": "gpt-35-turbo",
    "choies": [
    	{
        	"finish_reason": "stop",
            "index": 0,
            "message": {
            	"role": "assistanct",
                "content": "반가워요."
            }
        }
    ]
}
// 기존 Class 예시
public class GptResponse {
	private String id;
    private String model;
    private List<Choice> choies;
}

 

 하지만 API 응답 결과에 새로운 field가 추가되는 경우, 매핑 Class에 해당 field 값이 없다면 Unrecognized field "{field_nm}"와 같은 오류가 발생하게 된다.

// 변경된 응답 예시
{
	"id": "1201204567",
    "model": "gpt-35-turbo",
    "choies": [
    	{
        	"finish_reason": "stop",
            "index": 0,
            "message": {
            	"role": "assistanct",
                "content": "반가워요."
            }
        }
    ],
    "promt_filter_results": ...
}

이 때 해당 field 값이 불필요하다 혹은 추후 신규 field 추가로 오류 발생을 예방하고자 한다면 해당 코드를 수정해야 한다.

 

 첫 번째로 @JsonIgnoreProperties(ignoreUnknown = true)를 이용할 수 있다.

매핑되는 클래스의 상단에 @JsonIgnoreProperties(ignoreUnknown = true)를 적용하면 이후 신규 추가 field에 대해 무시하고 지나가게된다.

 그러나 해당 depth에만 적용되며 하위 depth에도 신규건이 추가된 경우 동일하게 오류가 발생하므로 하위 매핑 Class에도 적용하여야 한다.

// Ignore가 적용된 Class 예시
@JsonIgnoreProperties(ignoreUnknown = true)
public class GptResponse {
	private String id;
    private String model;
    // Choice 클래스에 매핑되는 부분에도 신규 field 추가된 경우 동일한 오류가 발생함
    private List<Choice> choies;	
}

 

 두 번째 방법은 ObjectMapper 객체 생성시 DeserializationFeature 옵션을 사용하여 오류를 해결 할 수 있다.

ObjectMapper objectMapper = new ObjectMapper()
		.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        
objectMapper.readValue(response.getBody(), GptResponse.class);

 

반응형

댓글