2011-10-20 4 views
7

Ho un'interfaccia di terze parti che fornisce file xsd che corrispondono alla loro API. Alcuni dei loro mappature non sono abbastanza Java, il solito booleano come 0 & 1 :-(Specificare la classe @XmlJavaTypeAdapter tramite il file di bind?

mi piacerebbe utilizzare un file binding per specificare la classe @XmlJavaTypeAdapter per la mia BooleanAdapter, ma finora nessuna gioia.

il file

le associazioni:

<?xml version="1.0" encoding="UTF-8"?> 
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns="http://java.sun.com/xml/ns/jaxws" 
    jaxb:extensionBindingPrefixes="xjc" jaxb:version="2.0"> 
    <jaxb:bindings schemaLocation="GetUserDetailsResponse.xsd" node="/xs:schema" > 
     <jaxb:globalBindings underscoreBinding="asWordSeparator" > 
      <jaxb:serializable uid="1" /> 
      <jaxb:javaType name="java.lang.Boolean" xmlType="xs:boolean" 
printMethod="mumble.bindings.BooleanAdapter.marshall" 
parseMethod="mumble.bindings.BooleanAdapter.unmarshall" /> 
     </jaxb:globalBindings> 
    </jaxb:bindings> 
</jaxb:bindings> 

E dal momento che sto usando Maven il bit rilevante dal POM:

<strict>false</strict> 
<extension>true</extension> 
<verbose>true</verbose> 
<enableWrapperStyle>false</enableWrapperStyle> 
<enableAsyncMapping>false</enableAsyncMapping> 

ho attivato enableWrapperS tyle e nessun cambiamento

Quello che io alla fine-up con un adattatore generato del tipo sbagliato:

import javax.xml.bind.annotation.adapters.XmlAdapter; 
public class Adapter1 
    extends XmlAdapter<String, Boolean>{ 
    public Boolean unmarshal(String value) { 
     return (mumble.bindings.BooleanAdapter.unmarshall(value)); 
    } 

    public String marshal(Boolean value) { 
     return (mumble.bindings.BooleanAdapter.marshall(value)); 
    } 
} 

c'è qualche associazioni di file magia posso usare per sbarazzarsi di wrapper generato e utilizzare il BooleanAdapter direttamente?

+0

Possono aiutare: http://blog.bdoughan.com/2011/08/xml-schema-to-java-generating.html –

+0

No, l'ho già visto, non è quello che voglio. Probabilmente potrei vivere con Adapter1 se potessi forzarlo a convertire int <--> booleano anziché stringa <--> booleano, ma l'inutile strato aggiuntivo di Adattatore alla fine mi irriterebbe. Grazie. –

+2

vedere questo: http://adventuresintechology.blogspot.ca/2012/04/binding-custom-xmljavatypeadapter-to.html. Sono stato in grado di implementare esattamente quello che stai chiedendo qui con l'aiuto di questo post. –

risposta

10

È necessario utilizzare <xjc:javaType> nella configurazione di binding anziché <jaxb:javaType>. Per esempio:

<xjc:javaType name="java.lang.Boolean" xmlType="xs:boolean" 
       adapter="mumble.bindings.BooleanAdapter"/> 

Capisco che sto rispondendo ad una vecchia questione, ma io non ho abbastanza reputazione per scrivere un commento.

+0

'Capisco che sto rispondendo a una vecchia domanda, ma non ho abbastanza reputazione per scrivere un commento. Non dovresti rispondere comunque nei commenti! :) –

+0

non funziona: https://stackoverflow.com/questions/46037803/why-jaxb-adapter-annotation-is-not-added-to-the-proxy-classes – grep

3

E 'una risposta super tardi, mi rendo conto, ma anche la risposta mvv s' mi ha lasciato lottando per capire completamente quello che stavo facendo e dove nella struttura del nuovo elemento in forma, così ho voluto aggiungere qualche ulteriore dettaglio per chiunque ci siamo imbattuti in questo dopo.

Per mvv, la risposta più semplice è passare a xjc:javaType. Vedere jaxb customization per la documentazione dettagliata sull'uso di xjc:javaType.

Sarà inoltre necessario modificare l'adattatore personalizzato (BooleanAdapter) per implementare l'interfaccia XmlAdapter.

In ultima analisi, il vostro legame sarebbe invece simile a questa:

<?xml version="1.0" encoding="UTF-8"?> 
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns="http://java.sun.com/xml/ns/jaxws" 
    jaxb:extensionBindingPrefixes="xjc" jaxb:version="2.0"> 
    <jaxb:bindings schemaLocation="GetUserDetailsResponse.xsd" node="/xs:schema" > 
     <jaxb:globalBindings underscoreBinding="asWordSeparator" > 
      <jaxb:serializable uid="1" /> 
      <xjc:javaType name="java.lang.Boolean" xmlType="xs:boolean" 
        adapter="mumble.bindings.BooleanAdapter" /> 
     </jaxb:globalBindings> 
    </jaxb:bindings> 
</jaxb:bindings> 
+0

jenrmagas: sai per caso come per fare in modo che l'adattatore esegua il marshalling e unmarshalling per java.util.List? Si noti che accetta xmlType = "xyz" e le "liste" nello Schema sono rappresentate con maxOccurance = non limitato piuttosto che un effettivo tipo di schema. – Malvon

+0

hm .. non funziona: https://stackoverflow.com/questions/46037803/why-jaxb-adapter-annotation-is-not-added-to-the-proxy-classes – grep