当我从以下架构生成代码时,会创建两个类A
和B
。但是,这两个类没有@XmlRootElement
注释,所以当我尝试编组B的实例时出现错误。
我在网上看过,我尝试使用自定义绑定(<xjc: simple/>
)解决方案,但它不起作用。似乎必须在模式中定义类型B的元素才能使此解决方案起作用。
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns:ns="com:mycomp:service" xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="com:mycomp:service"
elementFormDefault="qualified" xml:lang="EN">
<complexType name="A" abstract="true">
<sequence>
<element name="a1" type="string" />
<element name="a2" type="string" />
</sequence>
</complexType>
<complexType name="B">
<complexContent>
<extension base="ns:A">
<sequence>
<element name="b1" type="string" />
</sequence>
</extension>
</complexContent>
</complexType>
</schema>
由于
答案 0 :(得分:1)
这是正确的,因为您的架构不会声明任何根元素,只会声明类型。如果要编组一个@XmlType
- 注释类的实例,则需要将该实例包装在JAXBElement
中,以告诉编组器使用哪个元素名称:
// create context from the package name that contains your generated classes
JAXBContext ctx = JAXBContext.newInstance("com.mycomp.service");
Marshaller marshaller = ctx.createMarshaller();
marshaller.marshal(new JAXBElement<B>(new QName("com:mycomp:service", "someB"),
B.class, instanceOfB), outputStream);
这会产生类似
的东西<someB xmlns="com.mycomp.service">
<a1>foo</a1>
<a2>bar</a2>
<b1>baz</b1>
</someB>
编辑:您已经评论过您自己没有进行编组,而是返回一个REST框架的对象来代表您进行编组。您可以通过声明您的操作返回JAXBElement<B>
而不仅仅是B
来使用相同的技巧,但您可能最好根据其他答案中的建议修改架构。
答案 1 :(得分:1)
如果所讨论的top元素的类型(通常是单个根元素)是匿名的,XJC将只生成@XmlRootElement。
EG。像(未经测试的):
<element name='B'>
<complexType>
<complexContent>
<extension base="ns:A">
<sequence>
<element name="b1" type="string" />
</sequence>
</extension>
</complexContent>
</complexType>
</element>
答案 2 :(得分:0)
您需要在架构中添加<element>
标记
<schema xmlns:ns="com:mycomp:service" xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="com:mycomp:service"
elementFormDefault="qualified" xml:lang="EN">
<complexType name="A" abstract="true">
<sequence>
<element name="a1" type="string" />
<element name="a2" type="string" />
</sequence>
</complexType>
<complexType name="B">
<complexContent>
<extension base="ns:A">
<sequence>
<element name="b1" type="string" />
</sequence>
</extension>
</complexContent>
</complexType>
<element name="A" type="ns:A"/>
<element name="B" type="ns:B"/>
</schema>