от
В моем приложении я настроил Джексона для использования
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.
@Service
public class ApiServiceImpl
        implements ApiService {

    private RestTemplate restTemplate;

    public ApiServiceImpl(RestTemplateBuilder restTemplateBuilder) {
        restTemplate = restTemplateBuilder
                .errorHandler(new RestTemplateResponseErrorHandler()).build();
    }

    @Override
    public ResponseEntity callAPI(String requestAsJson,
            String username, String password) {
        ResponseEntity result = null;
        HttpHeaders headers = getHeaders(username, password);

        result = restTemplate.exchange(uri, HttpMethod.POST,
                new HttpEntity(requestAsJson, headers),
                RegisterResponse.class);

        return result;
    }
}
Ответ выглядит следующим образом:
{
    "redirect

И я хочу десериализовать это к следующему POJO напрямую. (Как в restTemplate.exchange настроено)

public class RegisterResponse {

    @JsonProperty("redirect

Понятно получить это исключение из-за функции UNWRAP_ROOT_VALUE
:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Root name 'redirect

Как я могу настроить Jackson
, чтобы не использовать
DeserializationFeature.UNWRAP_ROOT_VALUE
в этом конкретном случае?              

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

1 Ответ

0 голосов
от
Как прокомментировал JB Nizet, возможно, установив новый экземпляр
MappingJackson2HttpMessageConverter
и
ObjectMapper
для Jakson в список
MessageConverters
.
restTemplate.getMessageConverters().add(getCustomConverter());

private MappingJackson2HttpMessageConverter getCustomConverter() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
        mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        MappingJackson2HttpMessageConverter customConverter = 
            new MappingJackson2HttpMessageConverter(mapper);
        if (!restTemplate.getMessageConverters()
                .removeIf(MappingJackson2HttpMessageConverter.class::isInstance)) {
            new RuntimeException("Custom MappingJackson2HttpMessageConverter not found");
        }
        return customConverter;
    }
    
...