使用Jackson的ObjectMapper进行JSON到JAXB转换的问题

时间:2016-12-10 15:54:26

标签: json jaxb jersey jackson objectmapper

我正在开发一个JAX-RS项目。我使用Jackson的ObjectMapper面临JSON到JAXB转换的问题。

使用的技术/框架是 - - 泽西岛2.23.2 - 杰克逊(FasterXML)2.8.5 - JAXB 2.2

为了使REST服务通用,我使用LinkedHashMap作为方法参数而不是pojo。因此,整个json数据被jersey / jackson框架转换为LinkedHashMap,我将在REST服务中作为参数获取。稍后在流程中,我会根据具体情况将其转换为适当的JAXB对象。

问题在于转换为JAXB时所有IDREF字段。

对于以下XSD片段 -

<xsd:attribute name="ref" type="xsd:IDREF">
</xsd:attribute>

JAXB的xjc工具在JAXB类中生成以下Java代码片段 -

@XmlAttribute(name = "ref")
@XmlIDREF
@XmlSchemaType(name = "IDREF")
protected Object ref;

此IDREF(@XmlIDREF)带注释的字段应该实际上具有对同一根JAXB对象的对象图中某处的另一个子对象的引用。另一个对象将被指定为ID(@XmlID),如下面的代码片段 -

@XmlID
@XmlSchemaType(name = "ID")
protected String objectKey;

及其等效的xsd片段是 -

<xsd:attribute name="ObjectKey" type="xsd:ID" .....>
</xsd:attribute>

转换后,而不是'ref'字段中对Java对象的实际引用,它引用了相应的LinkedHashMap本身。基本上由于'ref'是'Object'类型,Jackson的ObjectMapper将其设置为as-is而不反省@XmlIDREF注释。在从XML转换为JAXB时,JAXB的unmarshaller正确处理了这个问题。但杰克逊的ObjectMapper在从json转换为JAXB时似乎并没有解决这个问题。

我已经尝试在Jackson的ObjectMapper中注册JaxbAnnotationIntrospector,但唯一的区别是,IDREF字段具有String值而不是LinkedHashMap。

我不确定我是否遗漏了什么。

任何解决方案都会非常有用。

1 个答案:

答案 0 :(得分:0)

我创建了一个通用组件来解决此ID ref问题,该问题将对每个ID和ID ref进行内部检查并加以解决。

如果需要此组件,请告诉我。