使用Jackson的ObjectMapper将JSON转换为JAXB的问题

zpf6vheq  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(217)

我正在做一个JAX-RS项目。我在使用Jackson的ObjectMapper将JSON转换为JAXB时遇到了一个问题。
所使用的技术/框架是Jersey 2.23.2 -Jackson(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将其设置为原样,而不检查@XmlIDREF注解。在从XML转换为JAXB时,JAXB的解组器可以正确地处理这个问题。但是Jackson的ObjectMapper在从json转换到JAXB时似乎没有解决这个问题。
我已经尝试过在Jackson的ObjectMapper中注册JaxbAnnotationIntrospector,但唯一的区别是,IDREF字段的值是String而不是LinkedHashMap。
我不确定我是否错过了什么。
任何解决方案都将非常有帮助。

sgtfey8w

sgtfey8w1#

下面的开源git repo解决了这个问题-jaxb-id-resolver
在将JSON反序列化为JAXB对象之后,调用JaxbIdRefResolverImpl类上的resolve()方法。

相关问题