В моем приложении я настроил Джексона для использования SerializationFeature.WRAP_ROOT_VALUE
и DeserializationFeature.UNWRAP_ROOT_VALUE
во всем мире.
@Configuration
public class AppConfig {
public Jackson2ObjectMapperBuilder jacksonBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.featuresToEnable(SerializationFeature.WRAP_ROOT_VALUE, DeserializationFeature.UNWRAP_ROOT_VALUE);
return builder;
}
}
Эта конфигурация работает нормально, но сейчас я нахожусь в ситуации, когда в deserialization
случае я получаю ответ JSON без rootname
. Итак, у меня есть класс обслуживания, который создает RestTemplate
с использованием RestTemplateBuilder
и POST
некоторых данных для REST-Webservice.
@Service
public class ApiServiceImpl
implements ApiService<RegisterResponse> {
private RestTemplate restTemplate;
public ApiServiceImpl(RestTemplateBuilder restTemplateBuilder) {
restTemplate = restTemplateBuilder
.errorHandler(new RestTemplateResponseErrorHandler()).build();
}
@Override
public ResponseEntity<RegisterResponse> callAPI(String requestAsJson,
String username, String password) {
ResponseEntity<RegisterResponse> result = null;
HttpHeaders headers = getHeaders(username, password);
result = restTemplate.exchange(uri, HttpMethod.POST,
new HttpEntity<String>(requestAsJson, headers),
RegisterResponse.class);
return result;
}
}
Ответ выглядит следующим образом:
{
"redirect-url": "https://any-url.com/?with=params"
}
И я хочу десериализовать это непосредственно для следующего POJO. (Как в restTemplate.exchange настроено)
public class RegisterResponse {
@JsonProperty("redirect-url")
private String redirectUrl;
//getter/setter
}
Понятно, что получить это исключение можно из-за функции UNWRAP_ROOT_VALUE
:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Root name 'redirect-url' does not match expected ('RegisterResponse') for type [simple type, class xxx.xxx.xxxservice.xxx.model.response.entity.RegisterResponse]
at [Source: (String)"{
"redirect-url": "https://any-url.com/?with=params"
}"; line: 2, column: 5]
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1356)
at com.fasterxml.jackson.databind.ObjectMapper._unwrapAndDeserialize(ObjectMapper.java:4087)
Как я могу настроить Jackson
, чтобы не использовать DeserializationFeature.UNWRAP_ROOT_VALUE
в данном конкретном случае?