2012-09-04 23 views
5

Im”próbuje użyć«-Xinject kod»rozszerzenie z XJC dodać trochę kodu do moich wygenerowanych klas. Dla następującego prostego schematu XSD ...Wstawianie kodu z XJC + xsd + jxb używając opcji „-Xinject kodów -extension”

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="MyList" > 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="MyItem" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="MyItem"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="id" type="xs:int"/> 
     <xs:element name="name" type="xs:string"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

</xs:schema> 

.. Mam związane następujące wiązania:

<?xml version="1.0" encoding="UTF-8"?> 
<jxb:bindings 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
xmlns:ci="http://jaxb.dev.java.net/plugin/code-injector" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
jxb:extensionBindingPrefixes="ci " 
jxb:version="2.1" 
> 

<jxb:bindings schemaLocation="test.xsd"> 
    <jxb:bindings node="/xs:schema/xs:element[@name='MyItem']"> 
     <ci:code> 
      @Override 
      public String toString() { return this.getName();} 
     </ci:code> 
    </jxb:bindings> 
</jxb:bindings> 

</jxb:bindings> 

Running XJC daje następujący wynik:

$ xjc -target 2.1 -verbose -Xinject-code -extension -d . -p generated -b test.jxb test.xsd 
parsing a schema... 
compiling a schema... 
[INFO] generating code 
unknown location 

generated/MyItem.java 
generated/MyList.java 
generated/ObjectFactory.java 

ale plik "generated/MyItem.java" nie zawiera nowej metody "toString". Jak mam to naprawić? Co to za wiadomość "nieznana lokalizacja"?

Uwaga:

$ xjc -version 
xjc 2.2.4 

EDIT:

zmieniając xsd: element, aby xsd: complexType spełnia swoje zadanie:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 


<xs:complexType name="MyItemType"> 
    <xs:sequence> 
     <xs:element name="id" type="xs:int"/> 
     <xs:element name="name" type="xs:string"/> 
    </xs:sequence> 
</xs:complexType> 

    <xs:element name="MyList" > 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="MyItem" type="MyItemType" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

</xs:schema> 

i

<?xml version="1.0" encoding="UTF-8"?> 
<jxb:bindings 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
xmlns:ci="http://jaxb.dev.java.net/plugin/code-injector" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
jxb:extensionBindingPrefixes="ci " 
jxb:version="2.1" 
> 

<jxb:bindings schemaLocation="test.xsd"> 
    <jxb:bindings node="/xs:schema/xs:complexType[@name='MyItemType']"> 
     <ci:code> 
      @Override 
      public String toString() { return this.getName();} 
     </ci:code> 
    </jxb:bindings> 
</jxb:bindings> 

</jxb:bindings> 

mogę teraz zobaczyć kod wygenerowany w pliku „/ MyItemType.java”

$ tail generated/MyItemType.java 


      @Override 
      public String toString() { return this.getName();} 

} 

ale jak mogę powiedzieć XJC aby wygenerować kod bez zmiany pliku XSD?

Odpowiedz

2

Proszę spróbuj /xs:schema/xs:element[@name='MyItem']/xs:complexType.

+0

Miałem dokładnie ten sam problem, a twoja odpowiedź jest poprawnym rozwiązaniem. Dzięki! – jhyot