2010-10-19 4 views
5

J'ai deux applications, l'une agissant en tant que client et l'autre en tant que serveur. Dans l'application serveur, je génère ObjectFactory et classes en utilisant xjc d'Eclipse. Par conséquent, l'une de ces classes s'appelle widgetEvenCall. De l'xsd:Bean java dynamique 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 génère les classes WidgetEventCall, WidgetEventDescriptor et WidgetParameter, avec leurs accesseurs.

L'application cliente, qui n'ont pas ni les classes ni les ObjectFactory, appelle un service à distance sur l'application de serveur, obtenir comme résultat un XML comme:

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

Heureusement, l'application client a accès à la Définition .xsd. Ma question est: Est-il possible, ayant le contenu de xml et la définition de xsd, de créer les objets pour widgetEventCall, widgetEventDescriptor et widgetParameter comme s'ils ont été créés par xjc, incluant des getters et des setters, gardant l'application cliente sans connaissance, using exclusivement réflexion? Y a-t-il un moyen automatisé d'y parvenir? Mon but est d'utiliser ce résultat dans un fichier JSP, c'est-à-dire de mettre l'objet en requête et d'y accéder comme widgetEventCall.widgetParameter [0] .someProperty, donc j'ai besoin que les getters soient générés.

Merci d'avance.
Joan.

Répondre

6

Vous pouvez utiliser Dynamic JAXB de EclipseLink MOXy pour ce cas d'utilisation (je suis le technicien MOXy).

Créer le contexte dynamique JAXB:

Le JAXBContext peut être bootstrapped à partir d'un XML:

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

Unmarshal XML:

Ensuite, vous utilisez un unmarshaller pour convertir le XML en objets:

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

Interagir avec les données:

L'instance de DynamicEntity vous obtenez en retour est un objet générique avec des méthodes get/set qui prennent un nom de propriété. Le nom de la propriété correspond à ce qui aurait été généré sur la classe statique par XJC.

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

Maréchal l'objet:

Ensuite, vous utilisez un placier pour convertir le XML en objets:

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

Pour plus d'informations, voir:

+1

Cela a l'air génial!Je vais essayer, mais j'ai peur de ne pas pouvoir ajouter de nouvelles librairies à mon application :(Merci beaucoup pour votre aide Joan. – Joan