3

プロジェクトをjaxb1.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"/>

ただし、ファイル、要素に次のようなコンテンツが含まれている場合に生成されます。

 <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>

なぜこれでしょうか?以前に生成されたクラスのセット(jaxb 1.0を使用)には、コンテンツを持つクラスだけでなく、すべての要素のクラスが含まれています。

これらの欠落しているクラスを生成するためにjaxbを取得するにはどうすればよいですか?xsdを変更する権限は実際にはありません(ただし、本当に必要な場合は変更できます)。

4

1 に答える 1

5

良いニュースは、「欠落しているクラス」を生成する必要がないことです。以下に例を示します。

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>

Foo

JAXB(JSR-222)実装は、複合型(名前付きまたは匿名)ごとにクラスを作成します。上記のXMLスキーマでは、複合型(foo)が1つしかないため、モデルクラスのみが生成されます。

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;
    }

}

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);
    }

}

デモ

以下は、ルート要素を使用してドキュメントを作成する方法の例です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);
    }

}

出力

以下は、デモコードの実行からの出力です。

<?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>
于 2012-10-21T19:59:10.923 に答える