2010-10-19 11 views
5

Biri istemci, diğeri ise sunucu olarak hareket eden iki uygulama sahibim. Sunucu uygulamasında Eclipse'den xjc kullanarak ObjectFactory ve sınıfları üretiyorum. Sonuç olarak, bu sınıflardan birine widgetEvenCall denir. Kimden xsd:xsd'den dinamik java fasulyesi

... 
<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 onların Alıcı ve ayarlayıcıların ile sınıfları WidgetEventCall, WidgetEventDescriptor ve WidgetParameter üretir.

bu sınıfları ne de ObjectFactory ne yok istemci uygulaması, gibi sonuç olarak bir XML alma, sunucu uygulaması uzaktan bir hizmeti çağırır:

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

Neyse ki, istemci uygulamanın eriştiği .xsd tanımı. Benim sorum: xml içeriği ve xsd tanımına sahip olmak, widgetEventCall, widgetEventDescriptor ve widgetParameter için nesneler oluşturmak için, alıcılar ve ayarlayıcılar da dahil olmak üzere xjc tarafından oluşturulmuşlar gibi, istemci uygulamasını bunlarla ilgili hiçbir bilgi sahibi olmadan tutmak gibi sadece yansıma? Buna ulaşmak için tek bir otomatik yolu var mı?

Amacım bu sonucun bir JSP dosyasına kullanılmasıdır, yani nesneyi istek içine koymak ve widgetEventCall.widgetParameter [0] .someProperty gibi ona erişmek, böylece oluşturulacak alıcılara ihtiyacım var.

Şimdiden teşekkürler.
Joan.

cevap

6

Bu kullanım durumu için EclipseLink MOXy'un Dinamik JAXB'sini kullanabilirsiniz (Ben MOXy teknoloji lideriyim).

Dinamik JAXB Bağlam oluşturun: JAXBContext bir XML önyükleyicisini edilebilir

:

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

unmarshal XML:

Sonra dönüştürmek için bir unmarshaller kullanmak Nesnelere XML:

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

Etkileşim:

geri almak DynamicEntity örneğinin bir özellik adı almak get/set yöntemleri ile genel bir nesnedir. Özellik adı, XJC tarafından statik sınıfta ne oluşturulacağına karşılık gelir.

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

Mareşal Nesne:

Sonra nesneler içine XML dönüştürmek için bir Marshaller kullanın: Daha fazla bilgi için

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

bkz:

+1

Bu harika görünüyor!Denemek için bir göz atacağım ama korkarım ki, başvuruma yeni kavanoz kütüphaneleri ekleyemiyorum :(Yardımınız için çok teşekkür ederim. – Joan

İlgili konular