从Jersey1客户端转换为Jersey2客户端(使用jackson 2.8.6)时,我现在在尝试读取界面时遇到映射异常
WebTarget resource = helper.resource(path);
if(schedule != null) resource = resource.queryParam("schedule", schedule);
return resource.request().get(new GenericType<MyInterface>(){});
Caused by: javax.ws.rs.client.ResponseProcessingException: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.mycompany.MyInterface: abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
旧的客户端代码如下所示:
WebResource resource = helper.resource(path);
if(schedule != null) resource = resource.queryParam("schedule", schedule);
try
{
return resource.get(new GenericType<MyInterface>(){});
}
catch(UniformInterfaceException e)
{
throw new RuntimeException(e.getResponse().getEntity(String.class));
}
在这两种情况下,我对客户端对象映射器的所有操作都是:
objectMapper.registerModule(new MrBeanModule());
是现在接口的动态实例化吗?如果没有,需要执行哪些其他配置步骤才能使其正常工作?
(我们的依赖关系有点混乱,所以我认为我使用Jersey 1.6和Jackson 1.9.8)
编辑: 作为我们依赖的先前行为的另一个示例,请参阅http://www.cowtowncoder.com/blog/archives/2011/08/entry_459.html,其中有一个没有注释的简单接口
答案 0 :(得分:1)
我想我经过大量的血,汗和眼泪后才发现它。
我发现我配置的ObjectMapper实际上并不是正在使用的那个。
Jersey1
clientConfig.getSingletons().add(new JacksonJsonProvider(objectMapper));
Client client = new Client(urlConnectionClientHandler, clientConfig);
JAXRS2(什么行不通)
clientConfig.register(new JacksonJsonProvider(objectMapper));
Client client = ClientBuilder.newClient(cc);
我发现创建实际使用的ObjectMapper的组件是Jackson Jaxb JsonProvider,并且使用ClientConfig注册它不起作用,但在客户端上注册它确实。
JAXRS2(做了什么工作)
Client client = ClientBuilder.newClient(cc);
client.register(new JacksonJaxbJsonProvider(objectMapper, JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS));