我正在将项目从jaxb 1.0迁移到2.1.当使用jaxb 2.1(通过ant xjc任务)从xsd生成类时,生成的类缺少没有任何内容的元素:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">
....
<xs:element name="get-all-services-partners-request"/>
Run Code Online (Sandbox Code Playgroud)
但是,当元素具有内容时会生成文件,如下所示:
<xs:element name="catalog-full-service-request">
<xs:complexType>
<xs:sequence>
<xs:element name="service-id" type="xs:string" minOccurs="0"/>
<xs:element name="log-id" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)
为什么会这样?前一组生成的类(使用jaxb 1.0)包含所有元素的类,而不仅仅是包含内容的类.
如何让jaxb生成这些缺失的类?我真的没有权利改变xsd(但如果真的有必要可以这样做).
好消息是你不需要生成"缺失的类",我将在下面举例说明.
schema.xsd
下面是XML架构的简化版本.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="unqualified">
<xs:element name="get-all-services-partners-request" />
<xs:complexType name="foo">
<xs:sequence>
<xs:element name="bar" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
富
JAXB(JSR-222)实现将为每个复杂类型(命名或匿名)创建一个类.在上面的XML模式中,只有一个复杂的类型(foo),因此只生成模型类.
package forum12990635;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "foo", propOrder = {
"bar"
})
public class Foo {
@XmlElement(required = true)
protected String bar;
public String getBar() {
return bar;
}
public void setBar(String value) {
this.bar = value;
}
}
Run Code Online (Sandbox Code Playgroud)
的ObjectFactory
与命名复杂类型对应的全局元素与@XmlElementDecl注释的类上的注释相对应@XmlRegistry(请参阅:http: //blog.bdoughan.com/2012/07/jaxb-and-root-elements.html).
package forum12990635;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlElementDecl;
import javax.xml.bind.annotation.XmlRegistry;
import javax.xml.namespace.QName;
@XmlRegistry
public class ObjectFactory {
private final static QName _GetAllServicesPartnersRequest_QNAME = new QName("", "get-all-services-partners-request");
public ObjectFactory() {
}
public Foo createFoo() {
return new Foo();
}
@XmlElementDecl(namespace = "", name = "get-all-services-partners-request")
public JAXBElement<Object> createGetAllServicesPartnersRequest(Object value) {
return new JAXBElement<Object>(_GetAllServicesPartnersRequest_QNAME, Object.class, null, value);
}
}
Run Code Online (Sandbox Code Playgroud)
演示
下面是如何使用根元素创建文档的示例get-all-services-partners-request.
package forum12990635;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance("forum12990635");
Foo foo = new Foo();
foo.setBar("Hello World");
ObjectFactory objectFactory = new ObjectFactory();
JAXBElement<Object> jaxbElement = objectFactory.createGetAllServicesPartnersRequest(foo);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(jaxbElement, System.out);
}
}
Run Code Online (Sandbox Code Playgroud)
产量
以下是运行演示代码的输出.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<get-all-services-partners-request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="foo">
<bar>Hello World</bar>
</get-all-services-partners-request>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2786 次 |
| 最近记录: |