我已经在这个问题上苦苦挣扎了好几天,不知道如何解决这个问题。任何快速帮助将不胜感激。
我需要从使用 apache CXF 和 jackson 从 REST 服务构建接收到的 JSON 字符串转换 LocalDate。我编写了自定义 ContextResolver 并在 Mapper 对象中注册了 JavaTimeModule。
当我运行应用程序时,默认构造函数被调用,这意味着它已被加载,但返回 ObjectMapper 的 getContext() 方法永远不会被调用。
我在服务器端和客户端注册了相同的ContextResolver。
所有依赖项均已就位(jackson databind、core、annotation、datatype-jsr310)。
当我直接在浏览器中点击 REST URI 时,我能够获取 JSON 响应。当我从客户端代码调用相同的 URI 带注释的方法时出现问题
下面是我的客户端代码。
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
@Provider //makes this bean a Provider
public class LocalDateObjectMapperContextResolver implements ContextResolver<ObjectMapper>{
private final ObjectMapper MAPPER;
public LocalDateObjectMapperContextResolver() {
MAPPER = new ObjectMapper();
MAPPER.registerModule(new JavaTimeModule());
MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return MAPPER;
}
}
<jaxrs:client id="testclient"
serviceClass="package1.RESTService"
username="abc"
password="abc"
address="$serviceURL">
<jaxrs:features>
<bean class="org.apache.cxf.transport.common.gzip.GZIPFeature"/>
<cxf:logging/>
</jaxrs:features>
<jaxrs:providers>
<bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/>
<bean class="mypackage.LocalDateObjectMapperContextResolver"/>
</jaxrs:providers>
</jaxrs:client>
同样的方式,这个 contextResolver 也在服务器端注册
<jaxrs:server>
.....
<jaxrs:providers>
<bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider"/>
<bean class="mypackage.LocalDateObjectMapperContextResolver"/>
</jaxrs:providers>
</jaxrs:server>
没有调用 getContext 的任何原因?
我还尝试扩展 ObjectMapper 并在那里注册 javaTimeModule,但不知道如何在 Jackson flow 中注册 customObjectMapper。我只是放置默认构造函数进行测试,并且它确实在应用程序启动时被调用,但话又说回来,没有结果,我仍然遇到相同的错误。
错误:找不到类型 [简单类型,类 java.time.LocalDate] 的合适构造函数:无法从 JSON 对象实例化(需要添加/启用类型信息?)