2009-12-10 12 views
17

Tengo un esquema XML existente que contiene un tipo que me gustaría asignar a un mapa de Java de algún tipo utilizando JAXB. Mi proceso de compilación toma el esquema y crea los beans. Me gustaría personalizar este proceso al tener uno de los complexTypes en mi mapa de esquema a java.util.Map. Leí en alguna parte que JAXB "no puede hacer interfaces". No estoy seguro de si eso se aplica en este caso, pero de ser así estaría bien con la asignación a un HashMap. Además, no necesariamente tiene que ser el complexType que se asigna a un mapa, podría ser un elemento si eso es lo que se requiere.¿Es posible usar JAXB para mapear de un esquema a java.util.Map?

Controlo mi generación JAXB usando un archivo .xjb, así que estoy buscando <jaxb:bindings> para poner allí. He intentado lo siguiente, pero no funciona:

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

Editar: He añadido más detalle en lo anterior vinculante que ya he intentado. Se genera el siguiente error durante la compilación del esquema:

[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> no funcionará, ya que sólo se puede utilizar para mapping between XML Schema primitives and Java types. Como quiero hacer un mapa entre un tipo complejo y uno de Java, no puedo usar esto.

+0

Su enfoque '.xjb' es el correcto, y debería funcionar. ¿XJC simplemente lo ignora o genera algo incorrecto? – skaffman

+0

Usando el enfoque .xjb anterior, obtengo el siguiente error en mi compilación jaxb: El compilador [jaxb] [ERROR] no pudo respetar esta personalización de javaType. Se adjunta a un lugar equivocado o es incompatible con otras vinculaciones. – Zach

Respuesta

10

Su archivo XJC está utilizando la directiva "estándar" javaType, que creo que está limitada a la conversión de valores de cadena a un tipo java representativo. Como tal, solo es adecuado para convertir elementos simples y contenido de atributos.

La herramienta XJC proporciona una versión mejorada de javaType, que en teoría debería ser capaz de manejar estructuras más complejas. Por desgracia, esto aún no se ha implementado:

https://java.net/jira/browse/JAXB-209 (sin resolver)

Por ejemplo, ser capaz de asignar un tipo esquema a un HashMap podría ser un probable requisito para aquellos que utilizan basado en modelos de diseño /implementación. AFAICS, esto no es posible hoy en día. Por lo tanto, uno debe editar manualmente el código generado .

Parece que está de enhorabuena.

+0

Tenía la esperanza de que esta no fuera la respuesta, pero yo ' Me alegra saber que no me estoy perdiendo nada. – Zach

6

¿Has mirado en ejemplo aquí (asignación personalizada de HashMap): http://java.sun.com/javase/6/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html

necesidad de crear la costumbre XmlAdapter me temo.

+1

¡Oye, esto se parece bastante a lo que quiero hacer! Lo único es que estoy usando un esquema para generar tipos Java (como parte de mi proceso de compilación). No me importa escribir el adaptador, pero me gustaría evitar tener que haber implementado previamente la clase que genera el esquema (MyHashMapType y MyHashMapEntryType en el ejemplo vinculado) ya que esto va a ir hacia atrás para mí. es posible? – Zach

+0

No creo que esto sea estrictamente necesario, lo más probable es que sea solo un ejemplo extendido. Sé que lo hemos hecho en el pasado con solo esquema, archivo de personalización de enlace y adaptador. – maximdim

+0

Suena como JSON ... – duffymo

Cuestiones relacionadas