gpt4 book ai didi

java - 在配置全局设置的特殊情况下构建 Jacksons ObjectMapper

转载 作者:太空宇宙 更新时间:2023-11-04 09:32:44 26 4
gpt4 key购买 nike

在我的应用程序中,我将 Jackson 配置为全局使用 SerializationFeature.WRAP_ROOT_VALUEDeserializationFeature.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;
}
}

此配置工作正常,但现在我遇到的情况是,在反序列化情况下,我得到一个没有rootname的JSON响应。所以我有一个服务类,它使用 RestTemplateBuilder 构建 RestTemplate 并将一些数据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

最佳答案

就像 JB Nizet 评论的那样,可能是通过将 Jakson 的 MappingJackson2HttpMessageConverterObjectMapper 的新实例设置到 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;
}

关于java - 在配置全局设置的特殊情况下构建 Jacksons ObjectMapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56881675/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com