1

I'm trying to add an interface using the jaxb2-basics artifact from the jaxb2_commons maven group.

My pom.xml contains the following dependencies

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

and the plugin configuration looks like

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

As you can see from the above, there are two invocations of xjc, which both work. Focusing on the first one, my bindings file

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

works like a charm; but, when I attempt to add an interface to '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>

I receive the error message

 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.

which reports that the location was

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

which happens to correspond to

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

Now, I've tried a second directive to bind the interface to the XSD element

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

But I just get the same error message with the element's line number as the location.

Obviously one wants to attach an interface to a class, and all of the examples look pretty close to my bindings file, but something must be wrong.

My environment is

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"

Can someone explain why xjc believes the extension is operating on the wrong XSD type?

Edwin Buck
  • 69,361
  • 7
  • 100
  • 138

1 Answers1

0

In the construction

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

the node attribute is expected to be an XPath expression. (Or so it says at Oracle). Try adding the closing square bracket to make it one, and see if that helps.

C. M. Sperberg-McQueen
  • 24,596
  • 5
  • 38
  • 65
  • actually, the closing bracket is in the original source. As I stripped out the incriminating bits (changing it to someLogin) I messed up the XPath directive. I'll update it in the question. – Edwin Buck Dec 08 '12 at 03:01
  • Still, thank you very much for the pointer. If only it were that simple. – Edwin Buck Dec 08 '12 at 03:03