来自Jersey 1.x(1.17)和JAXB的JSON响应不能被Jackson反序列化

时间:2014-05-09 23:24:07

标签: json jaxb jackson jersey-1.0

我有一个运行1.17的球衣webservice,并支持通过@Produces注释通过XML和JSON返回响应。我假设它在返回JSON响应时默认使用JAXB,但我无法确认它。截至目前,我现有的客户端也使用相同的JAXB序列化器/反序列化器。我想创建一个使用Jackson的新客户端,而不会影响现有客户端。

JAXB JSON响应与Jackson for Maps不兼容。使用JAXB的地图的JSON格式为

"mapName":{"entry":[{"key":"key1","value":"value1"},{"key":"key2","value":"value2"}]}
杰克逊没能解析这个问题。有没有办法让杰克逊解析这个JSON?

另一个尝试:切换泽西使用杰克逊

这不是首选的选项,但我尝试将“com.sun.jersey.api.json.POJOMappingFeature”设置为true以允许它使用Jackson进行JSON序列化/反序列化,但是服务最终会在响应时返回500秒记录任何异常。 log4j记录器级别设置为TRACE。我启用了ContainerRepsonseFilter来确认响应中的500s,令我惊讶的是,它记录了成功的2xx响应。我的猜测是问题发生在堆栈的某个地方,但我不知道在哪里。

1 个答案:

答案 0 :(得分:0)

我最终使用了能够解析上述json格式的MOXy。

@Provider

public class JsonMoxyConfigurationContextResolver实现ContextResolver {

private final MoxyJsonConfig config;

public JsonMoxyConfigurationContextResolver() {
    final Map<String, String> namespacePrefixMapper = new HashMap<String, String>();
    namespacePrefixMapper.put("http://www.w3.org/2001/XMLSchema-instance", "xsi");

    config = new MoxyJsonConfig()
        .setNamespacePrefixMapper(namespacePrefixMapper)
        .setNamespaceSeparator(':');
}

@Override
public MoxyJsonConfig getContext(Class<?> objectType) {
    return config;
}

}

并使用

启用Jersey 2.x客户端
cc.register(JsonMoxyConfigurationContextResolver.class);