2012-03-21 13 views
9

Caso de uso:Insertar anotación personalizada en 'campo' java usando el plugin de anotar + JAXB (bajo xsd -> Java)

¿Quieres insertar anotación personalizada a los campos de clase java generados por JAXB

Problema:

Usando el complemento Annotate + JAXB [1], puedo insertar anotaciones personalizadas con éxito, pero se están insertando en el método getter en lugar de en el campo. Las anotaciones de Morphia (mongo DB) (que de hecho quiero insertar) pueden anotar solo los campos de java [2].

Mi xsd prueba:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1" 
xmlns:annox="http://annox.dev.java.net" jaxb:extensionBindingPrefixes="annox"> 

<xsd:element name="hoo" type="External" /> 
<xsd:complexType name="External"> 
    <xsd:sequence> 
     <xsd:element name="bar" type="xsd:string" /> 
     <xsd:element name="hoobar" type="xsd:string" /> 
    </xsd:sequence> 
</xsd:complexType> 
</xsd:schema> 

Mi prueba xjb vinculante:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<jaxb:bindings 
version="2.1" 
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 

    xmlns:annox="http://annox.dev.java.net" jaxb:extensionBindingPrefixes="annox"> 
    <jaxb:bindings schemaLocation="external.xsd" node="/xs:schema"> 

<jaxb:bindings node="xs:complexType[@name='External']/xs:sequence/xs:element[@name='bar']"> 
    <annox:annotate> 
    <annox:annotate 
     annox:class="java.lang.SuppressWarnings" 
     impl="com.acme.foo.MyFieldBridge"> 
    </annox:annotate> 
    </annox:annotate> 
</jaxb:bindings>  

Mi generada fragmento de java:

@XmlElement(required = true) 
protected String bar; 
@XmlElement(required = true) 
protected String hoobar; 

/** 
* Gets the value of the bar property. 
* 
* @return 
*  possible object is 
*  {@link String } 
*  
*/ 
@SuppressWarnings({ 

}) 
public String getBar() { 
    return bar; 
} 

Como puede ver, quiero anotar el campo "barra". Por favor avise. Pide más si es necesario.

[1] Generate @Indexed annotation using Jaxb or HyperJaxb
[2] Por ejemplo véase la anotación @Id de Morphia

+2

target = "campo" resuelve el problema: Avísame si tienes alguna otra solución. Perdón por molestar. – Hari

+2

No pude publicar esto como respuesta ya que tengo <100 de reputación. Gracias por mirar esto de todos modos. – Hari

+0

¿Cómo puedo insertar comentarios en xsd cuando genero un esquema? – wener

Respuesta

7

Ok, lo descubrió a sí mismo. Use <annox:annotate target="field"> para anotar un campo. Otras opciones son:

  • colocador
  • colocador parámetros
  • captador
  • campo
  • clase

Véase el documentation.

+1

Muchas gracias por su respuesta lexicore. – Hari

1

Sólo una cosa más: hay que poner el atributo field a la <annox:annotate> etiqueta externa:

<annox:annotate target="field"> 
    <annox:annotate annox:class="java.lang.SuppressWarnings"/> 
</annox:annotate> 

Ponerlo a la misma variable que el annox:class atribuyen reside podrían no funcionar. Eso me pasó a mí.