2010-07-23 10 views
5

Mi piacerebbe sapere come posso rendere il compilatore JAXB rendere certi elementi nel mio schema XML dichiarati come finali nella definizione di classe java e vorrei anche essere in grado di controllare i diversi costruttori, come in Vorrei un costruttore che potesse creare l'oggetto con un elenco completo di parametri contenuti nella classe e il costruttore privato predefinito richiesto da JAXB.Iniezione costruttore JAXB

Qualsiasi aiuto?

Grazie.

Ecco un esempio di quello che sto cercando di fare:

<xs:complexType name="mycomplex"> 
    <xs:all> 
     <xs:element name="myboolean" type="xs:boolean"/> 
    </xs:all> 
</xs:complexType> 

ora il codice generato sarà simile

public class mycomplex 
{ 
     protected boolean myboolean; 

     public boolean getMyboolean() { return myboolean; } 
     public void setMyboolean(boolean b) { this.myboolean = b; } 
} 

ma vorrei modificare lo schema per far sembrare Mi piace:

public class mycomplex 
{ 
     protected final boolean myboolean; 

     public mycomplex(boolean b) { this.myboolean = b; } 

     public boolean getMyboolean() { return myboolean; } 
} 

Questo obiettivo può essere raggiunto?

+0

prego ci dà esempi, tra cui il tipo di schema componenti di cui stai parlando e come li vuoi rappresentare in java. – skaffman

+0

post originale modificato. È possibile? – ExtremeCoder

+0

Non penso che lo sia, no. A mia conoscenza, l'iniezione del costruttore non è mai stata aggiunta a JAXB2, anche se penso che sia stata pianificata a un certo punto. – skaffman

risposta

0

Ho risolto questo in un altro modo. Sto creando uno strumento che modificherà i file di codice sorgente java prodotti e aggiungerà/rimuoverò ciò di cui ho bisogno. Fare riferimento a questo per ulteriori informazioni: Using the Eclipse AST

0

Non esiste un metodo JAXB standard per generare una classe simile a questa, poiché la specifica JAXB non supporta il mapping a una classe come quella.

È possibile utilizzare il seguente codice per evitare di avere un metodo impostato. È possibile aggiungere ulteriori costruttori se si desidera fino a quando è uno di default pubblico.

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class mycomplex  
{  
     protected final boolean myboolean;  

     public boolean getMyboolean() { return myboolean; }  
}  

Se si desidera utilizzare la classe che hai descritto sopra con un costruttore non predefinito e un campo segnato finale è necessario creare un XMLAdapter:

+0

Grazie mille per questo, ma non è interamente ciò che sono cercando. Sarò in grado di sbarazzare centinaia di classi, il che significa che fare qualcosa del genere sarà abbastanza noioso, perché devo definire tutto da solo e queste classi cambieranno di volta in volta -> molto tempo se devo ridefinire cose tutto il tempo. C'è un modo per accogliere questo tipo di comportamento in un processo più automatizzato attraverso centinaia di classi diverse? Grazie ancora. – ExtremeCoder

+0

@BlaiseDoughan hai la possibilità di aggiungere http://docs.oracle.com/javase/6/docs/api/java/beans/ConstructorProperties.html al tuo Moxy? –

+0

@AdamGent - Ti dispiacerebbe fornire un commento sulla seguente richiesta di miglioramento ?: http://bugs.eclipse.org/328951 –

Problemi correlati