我有以下 XSD:
<xsd:element name="products" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="product" type="foo:myProduct" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
现在,当我发出 XJC 时,它不会生成 Products.class 文件,而只会生成 Product.class。当然,我的 XML 看起来像这样:
<products>
<product>...</product>
<product>...</product>
</products>
所以最后,我没有带有 XmlRootElement 注释的类,这很奇怪。当然我无法让编码工作。
任何提示我的 XSD 可能有什么问题,或者我需要告诉 XJC 创建该类吗?在我看来,需要生成一个包装类!?
谢谢
最佳答案
选项:
- 检查您的
ObjectFactory
对于像createProducts(...)
这样的方法. - 使用
JAXBElement<Products>
. - 使用
<jaxb:class name="ProductsElement"/>
自定义您的元素- 你会得到一个ProductsElement
与@XmlRootElement
. - 您还可以使用jaxb2-annotate-plugin添加
@XmlRootElement
到您现有的Products
类。
更新
这是我的一个项目中的一个小例子。我有一个像
的构造<element name="Capabilities" type="wps:WPSCapabilitiesType">
</element>
在 ObjectFactory
我有:
@XmlElementDecl(namespace = "http://www.opengis.net/wps/1.0.0", name = "Capabilities")
public JAXBElement<WPSCapabilitiesType> createCapabilities(WPSCapabilitiesType value) {
return new JAXBElement<WPSCapabilitiesType>(_Capabilities_QNAME, WPSCapabilitiesType.class, null, value);
}
所以你应该得到像 createProducts(...)
这样的方法在你的ObjectFactory
- 不是针对类型而是针对元素。这是关于选项 1 的。
选项 2 - 它并不神秘。您只需创建 JAXBElement
的实例提供元素的限定名称、值的类型和值:
new JAXBElement<WPSCapabilitiesType>(_Capabilities_QNAME, WPSCapabilitiesType.class, null, value);
在你的情况下将类似于 new JAXBElement<ProductsType>(new QName("products"), Products.class, null, products)
.
最后你说你没有Products
类但仅限 Product
类(class)。嗯。这意味着您不会获得为 products
中声明的匿名复杂类型生成的类。元素。这并非不可能,但我不知何故怀疑这里是否存在这种情况。检查您的类(class)是否有类似 ProductsType
的类(class)或ProductsElement
.
关于java - 在 xsd 上使用 xjc 时缺少包装类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27549171/