2010-07-23 13 views
5

Me gustaría saber cómo puedo hacer que el compilador JAXB haga que ciertos elementos en mi esquema XML se declaren como finales en la definición de la clase java y también me gustaría poder controlar los diferentes constructores, como en Me gustaría un constructor que pueda crear el objeto con una lista completa de parámetros contenidos en la clase, así como el constructor privado predeterminado que necesita JAXB.JAXB constructor injection

¿Algún ayuda?

Gracias.

Aquí es un ejemplo de lo que estoy tratando de hacer:

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

ahora el código generado se verá algo como

public class mycomplex 
{ 
     protected boolean myboolean; 

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

pero me gustaría editar el esquema para que se vea como:

public class mycomplex 
{ 
     protected final boolean myboolean; 

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

     public boolean getMyboolean() { return myboolean; } 
} 

¿Se puede lograr esto?

+0

Por favor, nos dan ejemplos, incluyendo el tipo de esquema componentes de los que está hablando, y cómo los quiere representados en java. – skaffman

+0

publicación original editada. ¿Es posible? – ExtremeCoder

+0

No creo que sea, no. Que yo sepa, la inyección de constructor nunca se agregó a JAXB2, aunque creo que se planeó en un punto. – skaffman

Respuesta

0

Lo he resuelto de otra manera. Estoy creando una herramienta que editará los archivos de código fuente de Java producidos y agregará/eliminará lo que necesito. Consulte este para obtener más información: Using the Eclipse AST

0

No hay una forma JAXB estándar para generar una clase que se vea así, porque la especificación JAXB no admite la asignación a una clase como esa.

Puede usar el siguiente código para evitar tener un método de configuración. Puede agregar constructores adicionales si lo desea, siempre que haya uno público predeterminado.

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

Si desea utilizar la clase que se ha descrito anteriormente con un constructor no predeterminado y un campo marcado final que tendrá que crear un XmlAdapter:

+0

Muchas gracias por esto pero no es del todo lo que soy buscando. Desenredaré cientos de clases, lo que significa que hacer algo como esto va a ser bastante tedioso ya que tengo que definir todo yo mismo y estas clases variarán de vez en cuando -> consumirán mucho tiempo si tengo que volver a definir cosas todo el tiempo. ¿Hay alguna manera de acomodar este tipo de comportamiento en un proceso más automatizado a través de cientos de clases diferentes? Gracias de nuevo. – ExtremeCoder

+0

@BlaiseDoughan ¿hay alguna posibilidad de que agregue http://docs.oracle.com/javase/6/docs/api/java/beans/ConstructorProperties.html a su Moxy? –

+0

@AdamGent - ¿Te importaría proporcionar esto como un comentario sobre la siguiente solicitud de mejora ?: http://bugs.eclipse.org/328951 –