2009-12-10 5 views
17

Ho uno schema XML esistente che contiene un tipo che vorrei mappare a una mappa Java di qualche tipo usando JAXB. Il mio processo di compilazione prende lo schema e crea i bean. Vorrei personalizzare questo processo avendo uno dei complessiTipi nel mio schema mappare su una java.util.Map. Ho letto da qualche parte che JAXB "non può fare interfacce". Non sono sicuro che ciò si applichi in questo caso, ma se così fosse, mi piacerebbe farlo mappare ad una HashMap. Inoltre, non necessariamente deve essere il complexType che si associa a una mappa, potrebbe essere un elemento se è ciò che è richiesto.È possibile utilizzare JAXB per mappare da uno schema a un java.util.Map?

Controllo la mia generazione JAXB utilizzando un file .xjb, quindi sto cercando un po 'di <jaxb:bindings> da inserire. Ho provato quanto segue, ma non funziona:

<jaxb:bindings schemaLocation="myschema.xsd" node="/xs:schema"> 
    <jaxb:globalBindings> 
     <jaxb:serializable uid="1"/> 
    </jaxb:globalBindings> 
    <jaxb:schemaBindings> 
     <jaxb:package name="com.myschema.client.types"/> 
    </jaxb:schemaBindings> 
    <jaxb:bindings node="//xs:complexType[@name='MapType']"> 
      <jaxb:javaType name="java.util.HashMap" 
      parseMethod="com.myschema.common.MapConverter.parseObjectToMap" 
      printMethod="com.myschema.common.MapConverter.printMapToObject" /> 
    </jaxb:bindings> 
</jaxb:bindings> 

Edit: ho aggiunto ulteriori dettagli sulla sopra vincolante che ho già provato. Esso genera il seguente errore durante la compilazione dello schema:

[jaxb] [ERROR] compiler was unable to honor this javaType customization. It is attached to a wrong place, or its inconsistent with other bindings. 

<jaxb:javaType> non funzionerà, perché può essere utilizzato solo per mapping between XML Schema primitives and Java types. Dal momento che voglio mappare tra un tipo complesso e un tipo Java, non posso utilizzarlo.

+0

L'approccio '.xjb' è corretto e dovrebbe funzionare. XJC lo ignora o genera la cosa sbagliata? – skaffman

+0

Utilizzando l'approccio .xjb sopra riportato, ottengo il seguente errore nella mia compilazione jaxb: [jaxb] Il compilatore [ERROR] non è stato in grado di onorare questa personalizzazione javaType. È collegato a un posto sbagliato o è incoerente con altri attacchi. – Zach

risposta

10

Il file XJC utilizza la direttiva "standard" javaType, che a mio avviso è limitata alla conversione di valori stringa da e verso un tipo java rappresentativo. In quanto tale, è adatto solo per convertire elementi semplici e contenuti di attributi.

Lo strumento XJC fornisce una versione migliorata di javaType, che in teoria dovrebbe essere in grado di gestire strutture più complesse. Purtroppo, questo non è ancora stata implementata:

https://java.net/jira/browse/JAXB-209 (non risolto)

Per esempio, essendo in grado di mappare un tipo schema a un HashMap potrebbe essere un probabile requisito per coloro che utilizzano modello guidato la progettazione /implementazione. AFAICS, questo non è possibile oggi. Pertanto, è necessario modificare manualmente il codice generato .

Sembra che tu non abbia fortuna.

+0

Speravo che questa non sarebbe stata la risposta, ma io ' Sono lieto di sapere che non mi manca niente. – Zach

6

Hai guardato esempio qui (mappatura personalizzata di HashMap): http://java.sun.com/javase/6/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html

necessità di creare XMLAdapter personalizzato ho paura.

+1

Ehi, questo sembra abbastanza vicino a quello che voglio fare! L'unica cosa è che sto usando lo schema per generare i tipi Java (come parte del mio processo di compilazione). Non mi interessa scrivere l'adattatore, ma vorrei evitare di avere pre-implementato la classe che genera lo schema (MyHashMapType e MyHashMapEntryType nell'esempio collegato) poiché questo mi sta andando indietro. È possibile? – Zach

+0

Non penso che sia strettamente necessario, molto probabilmente è solo un esempio esteso. So che l'abbiamo fatto in passato con solo schema, file di personalizzazione vincolante e adattatore. – maximdim

+0

Suoni come JSON ... – duffymo