JAXB:XSDでattlタイプが指定されている場合、xjc生成クラス名を変更する方法は?

StackOverflow https://stackoverflow.com/questions/4793637

  •  24-10-2019
  •  | 
  •  

質問

私はJAXBの初心者であり、XJCでJavaクラスを生成する際に迷惑な問題を抱えています。私はこのようなXSDが提供されています:

<xs:element name="item" type="itemType"/>  
...   
<xs:complexType name="itemType">
    <xs:attribute name="id" type="xs:string" use="required">
    ...     
</xs:complexType>

XJCは呼ばれるクラスを生成しています ItemType.java, 、しかし、私は名前を望んでいます Item.java. 。つまり、XSDがこのようなものであるかのように、生成されたクラスが必要です。

<xs:element name="item">
    <xs:complexType>
    <xs:attribute name="id" type="xs:string" use="required">
        ...
    </xs:complexType>
</xs:element>

他の要素にはitemTypeの再利用はありません。XSDを構築するのは、この方法でそれを好む人々です。カスタムバインディングでそれを行う方法があるかもしれませんが、まだその方法を見つけていません。

何か助けがありますか?

ありがとう、ミゲル

役に立ちましたか?

解決

Jaxbはこれを達成するための2つの方法を提供します。

1.インラインスキーマアンクテーション

JAXBスキーマアノテーションを使用して、クラス名を制御できます。

<xs:schema 
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        jaxb:version="2.1">

    <xs:complexType name="itemType">
        <xs:annotation>
            <xs:appinfo>
                <jaxb:class name="Item"/>
            </xs:appinfo>
        </xs:annotation>
        <xs:attribute name="id" type="xs:string" use="required"/>
    </xs:complexType>

</xs:schema>

2.外部バインディングファイル

このカスタマイズは、外部バインディングファイルを介して実行することもできます。

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">

    <jxb:bindings schemaLocation="your-schema.xsd">
            <jxb:bindings node="//xs:complexType[@name='itemType']">
                <jxb:class name="Item"/>
            </jxb:bindings>
    </jxb:bindings>

</jxb:bindings>

XJCコマンドラインは次のとおりです。

xjc -d out -b binding.xml your-schema.xsd

他のヒント

さて、私はついにそれを行う方法を見つけました。私の外部バインディングファイルは次のとおりです。

<?xml version="1.0"?>
<jxb:bindings version="1.0"
              xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
              xmlns:xs="http://www.w3.org/2001/XMLSchema"
              xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
              jxb:extensionBindingPrefixes="xjc">

  <jxb:globalBindings>              
    <xjc:simple/>
  </jxb:globalBindings>

</jxb:bindings>

xjc コマンドは実行する必要があります -extension オプション。

このページで解決策を見つけました:

http://weblogs.java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html (編集: :時代遅れのリンク)

https://community.oracle.com/blogs/kohsuke/2006/03/03/why-does-jaxb-put-xmlrootelement-sometimes-not-always (新しいリンク)

よろしく、ミゲル

これは、複雑なタイプの名前を変更するために使用する外部バインディングファイルです。 CXFのWSDL2Javaでコンパイルします。

<?xml version="1.0" encoding="UTF-8"?>
<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema[1]">
        <jxb:bindings node="//xs:complexType[@name='VatNumber_exception']">
             <jxb:class name="VatNumException"/>
        </jxb:bindings>

    </jaxws:bindings>
</jaxws:bindings>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top