1

jaxb2_commons maven グループの jaxb2-basics アーティファクトを使用してインターフェイスを追加しようとしています。

私の pom.xml には、次の依存関係が含まれています

<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.2.7</version>
</dependency>
<dependency>
  <groupId>com.sun.xml.bind</groupId>
  <artifactId>jaxb-impl</artifactId>
  <version>2.2.6</version>
</dependency>
<dependency>
  <groupId>org.jvnet.jaxb2_commons</groupId>
  <artifactId>jaxb2-basics-runtime</artifactId>
  <version>0.6.4</version>
</dependency>

プラグイン構成は次のようになります

  <plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb22-plugin</artifactId>
    <version>0.8.2</version>
    <executions>
      <execution>
        <id>jaxb-generate-messages-in</id>
        <phase>generate-sources</phase>
        <goals>
          <goal>generate</goal>
        </goals>
        <configuration>
          <specVersion>2.2</specVersion>
          <schemaLanguage>XMLSCHEMA</schemaLanguage>
          <schemaDirectory>src/main/schema</schemaDirectory>
          <schemaIncludes>
            <include>MESSAGES-IN.xsd</include>
          </schemaIncludes>
          <bindingDirectory>src/main/binding</bindingDirectory>
          <bindingIncludes>
            <include>messages-in-binding.xjb</include>
          </bindingIncludes>
          <episodeFile>${project.build.directory}/generated-sources/messages-in/META-INF/jaxb-messages-in.episode</episodeFile>
          <generateDirectory>${project.build.directory}/generated-sources/messages-in</generateDirectory>
          <extension>true</extension>
          <args>
            <arg>-Xinheritance</arg>
          </args>
          <plugins>
            <plugin>
              <groupId>org.jvnet.jaxb2_commons</groupId>
              <artifactId>jaxb2-basics</artifactId>
              <version>0.6.4</version>
            </plugin>
          </plugins>
        </configuration>
      </execution>
      <execution>
        <id>jaxb-generate-messages-out</id>
        <phase>generate-sources</phase>
        <goals>
          <goal>generate</goal>
        </goals>
        <configuration>
          <specVersion>2.2</specVersion>
          <schemaLanguage>XMLSCHEMA</schemaLanguage>
          <schemaDirectory>src/main/schema</schemaDirectory>
          <schemaIncludes>
            <include>MESSAGES-OUT.xsd</include>
          </schemaIncludes>
          <bindingDirectory>src/main/binding</bindingDirectory>
          <bindingIncludes>
            <include>messages-out-binding.xjb</include>
          </bindingIncludes>
          <episodeFile>${project.build.directory}/generated-sources/messages-out/META-INF/jaxb-messages-out.episode</episodeFile>
          <generateDirectory>${project.build.directory}/generated-sources/messages-out</generateDirectory>
        </configuration>
      </execution>
    </executions>
    <configuration>
      <verbose>true</verbose>
    </configuration>
  </plugin>

上記からわかるように、xjc には 2 つの呼び出しがあり、どちらも機能します。最初のもの、私のバインディングファイルに焦点を当てます

<jaxb:bindings
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
  xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
  jaxb:extensionBindingPrefixes="xjc"
  version="1.0">
  <jaxb:bindings schemaLocation="../schema/MESSAGES-IN.xsd" node="/xs:schema">
    <jaxb:globalBindings typesafeEnumMaxMembers="3000">
      <jaxb:serializable uid="1"/>
    </jaxb:globalBindings>
    <jaxb:schemaBindings>
      <jaxb:package name="com.whatever.messages.request"/>
    </jaxb:schemaBindings>
    <jaxb:bindings node="//xs:simpleType[@name='YesOrNo']">
      <jaxb:class ref="com.whatever.messages.YesOrNo"/>
    </jaxb:bindings>
    <jaxb:bindings noade="//xs:complexType[@name='someLogin']">
      <jaxb:class name="LoginRequest">
        <jaxb:javadoc><![CDATA[A Login request message.]]>
        </jaxb:javadoc>
      </jaxb:class>
    </jaxb:bindings>
  </jaxb:bindings>
</jaxb:bindings>

魅力のように機能します。しかし、「LoginRequest」にインターフェースを追加しようとすると...

   <jaxb:bindings node="//xs:complexType[@name='someLogin']">
     <jaxb:class name="LoginRequest">
       <jaxb:javadoc><![CDATA[A Login request message.]]>
       </jaxb:javadoc>
     </jaxb:class>
     <inheritance:implements>com.whatever.messages.Request</inheritance:implements>
   </jaxb:bindings>

エラーメッセージが表示される

 Error while parsing schema(s).Location [ file:/C:/Users/justme/Documents/NetBeansProjects/someproject/src/main/binding/messages-in-binding.xjb{19,42}].
 com.sun.istack.SAXParseException2; systemId: file:/C:/Users/justme/Documents/NetBeansProjects/someproject/src/main/binding/messsages-in-binding.xjb; lineNumber: 19; columnNumber: 42; compiler was unable to honor this class customization. It is attached to a wrong place, or its inconsistent with other bindings.

場所があったことを報告します

 Error while generating code.Location [ file:/C:/Users/justme/Documents/NetBeansProjects/someproject/src/main/schema/MESSAGES-IN.xsd{106693,54}].

たまたま対応する

 <xs:complexType name="someLogin" mixed="true">
   ...
 </xs:complexType>

ここで、インターフェイスを XSD 要素にバインドする 2 番目のディレクティブを試しました。

 <xs:element name="someLogin" type="someLogin" substitutionGroup="externalMethod"/>

しかし、要素の行番号が場所と同じエラーメッセージが表示されます。

クラスにインターフェイスをアタッチしたいのは明らかで、すべての例は私のバインディング ファイルに非常に似ていますが、何かが間違っているに違いありません。

私の環境は

Apache Maven 3.0.4 (r1232337; 2012-01-17 02:44:56-0600)
Maven home: C:\Program Files\NetBeans 7.2.1\java\maven
Java version: 1.7.0_07, vendor: Oracle Corporation
Java home: C:\Program Files (x86)\Java\jdk1.7.0_07\jre
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 7", version: "6.1", arch: "x86", family: "windows"

拡張機能が間違った XSD タイプで動作していると xjc が考える理由を誰か説明できますか?

4

1 に答える 1

0

建設中

<jaxb:bindings 
  node="//Xs:complexType[@name='someLogin">
  ...
</jaxb:bindings>

属性は XPath 式であるnodeことが期待されます。(または、 Oracleでそう言っています)。閉じ角かっこを追加して 1 つにしてみて、それが役立つかどうかを確認してください。

于 2012-12-08T00:10:41.037 に答える