我有一堆从模式生成的类。我无法触摸它们-对我来说是一成不变的来源。

这些类是架构中的顶级元素。每个都指向相同名称的类型:

    <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

08-26 03:13