Sto lavorando a un'applicazione che utilizza XJC per generare POJO Java da XSD. Ci sono dozzine di schemi e quel numero crescerà. L'applicazione deve anche essere in grado di gestire diverse versioni dello stesso schema, il che significa che avrò più schemi che definiscono tipi comuni. Sto cercando di personalizzare i binding in modo che alcuni tipi di core implementino un'interfaccia comune. Il plugin Inheritance di JAXB2 Nozioni di base sembra fare ciò di cui ho bisogno, ma non riesco a trovare la giusta sintassi.JAXB ha generato classi di determinati tipi che implementano un'interfaccia personalizzata
Ecco la parte rilevante del mio schema:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:my="http://example.com/core"
targetNamespace="http://example.com/core"
xmlns:xml="http://www.w3.org/XML/1998/namespace">
...
<xs:complexType name="addressType">
<xs:sequence>
<xs:element name="Address" type="xs:string"/>
<xs:element name="City" type="xs:string"/>
<xs:element name="Province" type="xs:string"/>
<xs:element name="Country" type="xs:string"/>
<xs:element name="County" type="xs:string" minOccurs="0"/>
<xs:element name="PostalCode" type="xs:string"/>
</xs:sequence>
</xs:complexType>
...
</xs:schema>
... e questo è ciò che il mio file di collegamento personalizzato appare come:
<?xml version="1.0"?>
<jaxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
xmlns:my="http://example.com/core"
jaxb:extensionBindingPrefixes="inheritance"
version="2.1">
<jaxb:bindings scd="x-schema::my" xmlns:my="http://example.com/core">
<jaxb:globalBindings localScoping="toplevel">
<jaxb:serializable/>
<xjc:simple/>
</jaxb:globalBindings>
<jaxb:bindings scd="/type::my:addressType">
<inheritance:implements>com.mysite.validator.ValidatableAddress</inheritance:implements>
<!--<xjc:superInterface name="com.mysite.validator.ValidatableAddress"/>-->
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
sto usando il SCD approccio , poiché in tutti gli esempi di binding "tradizionali" che mostrano come utilizzare il plug-in di ereditarietà, viene specificato schemaLocation. Voglio evitare di dover specificare schemaLocation a causa del nostro grande (e crescente) numero di schemi. Non voglio dover modificare il file di bind ogni volta che aggiungiamo un nuovo schema. Quindi, scd sembra che soddisferà questo requisito.
Tuttavia quando si esegue la build utilizzando il sopra vincolante, ottengo questo:
[xjc] [ERROR] cvc-elt.1: Cannot find the declaration of element 'inheritance:implements'. [xjc] line 18 of file:/dev/workspace/my_app/etc/schemas/bindings-common.xml [xjc] failure in the XJC task. Use the Ant -verbose switch for more details [xjc] classLoader = [email protected] [xjc] SharedSecrets.getJavaNetAccess()[email protected]
Se commento fuori l'eredità : implementa linea e rimuovere il commento xjc: superinterfaccia linea, l'errore va via e la compilazione viene completata correttamente, ma le mie classi Indirizzo non implementano il tipo ValidatableAddress.
È possibile utilizzare il plug-in dell'ereditarietà con scd? Può xjc: superInterface essere limitato solo a determinati elementi?
Cheers.
Grazie lessical. Che ne dici di combinare scd e xjc: superInterface ... Dovrebbe funzionare? Qualche idea sul perché questo approccio non genera errori, ma non sembra avere alcun effetto sulla sorgente generata? – 6006604
... oppure xjc: superInterface considera una personalizzazione personalizzata/del fornitore proprio come l'ereditarietà: implementazioni? – 6006604
In realtà è un'estensione fornitore ma è un'estensione fornitore "di prima classe" che è specificamente nota a XJC (vedere [qui] (https://github.com/gf-metro/jaxb/blob/69471fb27af6a9e990ef2a7873aab64a18e87640/jaxb-ri/ xjc/src/main/resources/com/sun/tools/xjc/reader/xmlschema/bindinfo/binding.xsd # L81)) - a differenza di "inheritance: implements". A proposito, non è 'xjc: superInterface' per [solo collegamenti globali] (https://jaxb.java.net/nonav/2.1.15/docs/vendorCustomizations.html#superinterface)? Spiegherebbe perché è ignorato nella classe. – lexicore