在反序列化时,MrBean模块是否仍然自动支持动态实现简单接口?

时间:2018-02-02 04:33:16

标签: java json jackson jersey

从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,其中有一个没有注释的简单接口

1 个答案:

答案 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));