2010-10-19 21 views
5

Tengo dos aplicaciones, una que actúa como cliente y la otra como servidor. En la aplicación de servidor genero ObjectFactory y las clases usando xjc de Eclipse. Como resultado, una de estas clases se llama widgetEvenCall. Desde el xsd:Bean Java dinámico de xsd

... 
<xs:element name="widgetEventCall"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element minOccurs="1" maxOccurs="1" ref="tns:widgetEventDescriptor" /> 
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="tns:widgetParameter" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

JAXB xjc genera las clases WidgetEventCall, WidgetEventDescriptor y WidgetParameter, con sus captadores y definidores.

La aplicación cliente, que no tienen ni las clases ni la ObjectFactory, llamadas de forma remota un servicio en la aplicación de servidor, obteniendo como resultado un XML como:

. . . 
<widgetEventCall> 
    <widgetEventDescriptor> ... </widgetEventDescriptor> 
    <widgetParameter>...</widgetParameter> 
    <widgetParameter>...</widgetParameter> 
    . . . 
</widgetEventCall> 

Por suerte, la aplicación cliente tiene acceso a la definición .xsd. Mi pregunta es: es posible, teniendo el contenido xml y la definición xsd, crear los objetos para widgetEventCall, widgetEventDescriptor y widgetParameter como si hubieran sido creados por xjc, incluyendo getters y setters, manteniendo la aplicación cliente sin conocimiento de ellos, usando exclusivamente reflexión? ¿Hay una forma automática de llegar a esto?

mi objetivo es utilizar este resultado en un archivo JSP, es decir, poner el objeto en la solicitud y acceder a él como widgetEventCall.widgetParameter [0] .someProperty, así que necesito que se generen los captadores.

Gracias de antemano.
Joan.

Respuesta

6

Puede usar el JAXB dinámico de EclipseLink MOXy para este caso de uso (soy el líder tecnológico de MOXy).

Crear el Contexto Dinámico JAXB:

El JAXBContext puede bootstrap de un XML:

FileInputStream xsdInputStream = new FileInputStream("src/example/customer.xsd"); 
DynamicJAXBContext jaxbContext = 
    DynamicJAXBContextFactory.createContextFromXSD(xsdInputStream, null, null, null); 

unmarshal el XML:

A continuación, se utiliza un unmarshaller para convertir el XML en objetos:

FileInputStream xmlInputStream = new FileInputStream("src/example/dynamic/customer.xml"); 
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
DynamicEntity customer = (DynamicEntity) unmarshaller.unmarshal(xmlInputStream); 

interactuar con los datos:

La instancia de DynamicEntity se obtiene es un objeto genérico con métodos get/set que tienen un nombre de propiedad. El nombre de la propiedad corresponde a lo que XJC habría generado en la clase estática.

DynamicEntity address = jaxbContext.newDynamicEntity("org.example.Address"); 
address.set("street", "1 Any Street").set("city", "Any Town"); 
customer.set("address", address); 

Mariscal del objeto:

A continuación, se utiliza un contador de referencias para convertir el XML en objetos:

Marshaller marshaller = jaxbContext.createMarshaller(); 
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
marshaller.marshal(customer, System.out); 

Para más información ver:

+1

¡Esto se ve genial!Voy a echar un vistazo para intentarlo, pero me temo que no puedo agregar nuevas bibliotecas jar a mi aplicación :(Muchas gracias por su ayuda. Joan. – Joan

Cuestiones relacionadas