我几天来一直在努力解决这个问题,并且不知道如何解决这个问题。任何快速帮助将不胜感激。 我需要使用apache CXF和jackson从我从REST服务构建接收的JSON字符串转换LocalDate。我在Mapper对象中编写了自定义ContextResolver并注册了JavaTimeModule。 当我运行应用程序时,调用默认构造函数,这意味着它已被加载,但返回ObjectMapper的getContext()方法永远不会被调用。
我在服务器端和客户端注册了相同的ContextResolver。 所有依赖都到位(jackson数据绑定,核心,注释,数据类型-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流程中注册customObjectMapper。我只是把默认构造函数用于测试,它在应用程序启动时调用,但是再次,没有结果,我仍然得到相同的错误。
错误:找不到类型[simple type,class java.time.LocalDate]的合适构造函数:无法从JSON对象实例化(需要添加/启用类型信息?)
答案 0 :(得分:1)
我有完全相同的问题@peeskillet描述了问题评论。
我使用的是版本2中的Jackson依赖项和版本1中的jackson-jaxrs。
将所有依赖项移动到版本2时解决了所有问题。
答案 1 :(得分:0)
如果您使用的是Maven,则可以添加以下两个maven依赖项。
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
并添加以下代码段。
@Configuration
public class CxfConfig {
@Component
@javax.ws.rs.ext.Provider
public static class JacksonJaxbJsonProvider
extends com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider {
@Autowired
private ObjectMapper objectMapper;
@PostConstruct
public void init() {
objectMapper.registerModule(new Jdk8Module());
}
}
}