我有一堆从模式生成的类。我无法触摸它们-对我来说是一成不变的来源。
这些类是架构中的顶级元素。每个都指向相同名称的类型:
<xsd:element name="Foo" type="FooType"/>
生成具有所有必需属性的
FooType
一类,但没有@XmlRoot
批注。不会生成类Foo
。在JAXB中,实现使用查找表并显式解组对象:
JAXBContext ctx ...
FooType x = ctx.createUnmarshaller().unmarshal(source, FooType.class);
在spring-boot中,使用
Jaxb2Marshaller
,我无法提供class-Parameter。似乎,编组仅依靠@XmlRoot
注释来实现它的魔力。设置
marshaller.setMappedClass(FooType.class)
时,springboot解组器将使用它-但是,仅在我按需创建Jaxb2Marshaller时(似乎很昂贵),该实例在实例中设置一次并且不是线程安全的。我将需要访问JAXBContext本身,以创建自己的解组器。尽管这是可能的,但我无法在解组器上进行魔术初始化。有用的方法
Jaxb2Marshaller#createUnmarshaller()
是protected
。我只看到将
Jaxb2Marshaller
扩展到我自己的虚拟对象以扩大对受保护方法的访问的解决方案。这似乎不干净。我宁愿完全放弃
Jaxb2Marshaller
并沿用旧版应用程序,直接使用JAXB。 Spring的JAXB似乎不打算在这里涵盖我的情况。问题:我是否误解了这个概念?
Jaxb2Marshaller.setMappedClass()
的预期用途是什么? 最佳答案
也许我没有完全解决您问题的核心,但是如果缺少@XmlRootElement是您的问题,我建议您稍微调整一下您的架构。
我假设你有这样的事情:
<xsd:element name="Foo" type="FooType"/>
<!-- and somewhere in the schema also have -->
<xsd:complexType name="FooType">
<xsd:sequence>
<xsd:element name="blah" type="BlahType"/>
<xsd:element name="blah-blah" type="BlahBlahType" />
</xsd:sequence>
</xsd:complexType>
您需要做的是删除上面指定的两个并替换为:
<xsd:element name="Foo">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="blah" type="BlahType"/>
<xsd:element name="blah-blah" type="BlahBlahType" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
当您与Foo一起生成类时,它将自动具有@RootXmlElement