Spring

일관되지 않은 유형 List <Object> 대 Object를 처리하는 RestTemplate

기록만이살길 2021. 3. 23. 15:03
반응형

일관되지 않은 유형 List 대 Object를 처리하는 RestTemplate

1. 질문(문제점):

응답의 데이터 유형이 일치하지 않는 API를 가져 오는 동안 RestTemplate을 사용하는 데 문제가 있습니다.

API 자체를 변경하지 않고 작동하도록하는 방법이 있는지 궁금합니다 (API는 내 것이 아니므로 실제로 변경할 수 없습니다)

나는 객체 List을 가져올 때 상황이 있으며 비어 있지 않은 경우 다음과 같은 형식입니다.

{
    "orders": [
        {
        ...
        }
     ]
}

그러나 제한 매개 변수 또는 0 결과를 반환하는 다른 것으로이 API를 호출하면 응답 형식은 다음과 같습니다.

[]

직렬화 / 역 직렬화에 대한 개체가 있고 그 안에 주문 List이 있으므로 0 개 이상의 결과를 얻을 때 작동합니다. 스택에 이미 솔루션이 있는지 모르겠습니다 (아직 찾지 못했습니다).

이런 종류의 문제를 처리하는 방법에 대한 아이디어가 있습니까?

btw. 나는 이미 해당 API에 대한 github에 문제를 만들었지 만 고칠 때까지 어떻게 든 작동하고 싶습니다 (모든 해킹 감사합니다 :))

편집 : HTTP 상태 코드는 항상 200입니다.

2. 해결방안:

사용자 정의 된 objectmapper 를 사용하여이를 달성 할 수 있습니다.

public ObjectMapper createObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
    return objectMapper;
}

사용자 정의 ObjectMapper를 MappingJackson2HttpMessageConverter에서 사용할 수 있도록하려면 새 MappingJackson2HttpMessageConverter를 만들고 ObjectMapper 인스턴스를 전달하면됩니다.

private MappingJackson2HttpMessageConverter createMappingJacksonHttpMessageConverter() {
     MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
     converter.setObjectMapper(createObjectMapper());
     return converter;
}

그런 다음 RestTemplate을 만들고 사용자 지정 MappingJackson2HttpMessageConverter를 메시지 변환기 List에 추가 할 수 있습니다.

@Bean
public RestTemplate createRestTemplate() {
     RestTemplate restTemplate = new RestTemplate();
     restTemplate.getMessageConverters().add(0, 
     createMappingJacksonHttpMessageConverter());
}

그리고 이제 이것을 사용 restTemplate하여 단일 객체를 다음과 같이 읽습니다.List

List<Model> models = restTemplate.exchange(uri,POST,entity,
             new ParameterizedTypeReference<List<Model>>>(){});
65664968
반응형