2012-03-21 14 views
9

Caso d'uso:Inserire annotazioni personalizzate in 'campo' Java utilizzando plugin di annotare + JAXB (su XSD -> java)

Wanna inserire annotazioni personalizzate per i campi in classe Java generato dalla JAXB

Problema:

Utilizzando il plug-in Annotate + JAXB [1], sono in grado di inserire annotazioni personalizzate ma vengono inserite nel metodo getter anziché nel campo. Le annotazioni Morphia (mongo DB) (che in realtà voglio inserire) possono comunque annotare solo i campi java [2].

La mia prova xsd:

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

La mia prova XJB vincolante:

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

mio generato java frammento:

@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; 
} 

Come puoi vedere, voglio annotare il campo "bar". Si prega di avvisare. Chiedi di più se necessario.

[1] Generate @Indexed annotation using Jaxb or HyperJaxb
[2] Per esempio si veda l'annotazione @Id di Morphia

+2

target = "campo" risolve il problema: Fammi sapere se hai altre soluzioni. Scusa per il disturbo. – Hari

+2

Non ho potuto postare questa risposta come ho <100 reputazione. Grazie per la ricerca in questo comunque. – Hari

+0

Come posso inserire commenti su xsd quando generi schema? – wener

risposta

7

Ok, capito da soli. Utilizzare <annox:annotate target="field"> per annotare un campo. Altre opzioni sono:

  • setter
  • setter-parametro
  • getter
  • campo
  • classe

Vedere le documentation.

+1

Grazie mille per la tua risposta lessiconica. – Hari

1

Ancora una cosa: è necessario mettere l'attributo field al <annox:annotate> tag esterno:

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

Mettere allo stesso tag come il annox:class attributo risiede potrebbero non funzionare. È successo a me.

Problemi correlati