簡體   English   中英

來自xsd的動態java bean

[英]Dynamic java bean from xsd

我有兩個應用程序,一個作為客戶端,另一個作為服務器。 在服務器應用程序中,我使用Eclipse中的xjc生成ObjectFactory和類。 因此,其中一個類稱為widgetEvenCall。 來自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使用它們的getter和setter生成類WidgetEventCall,WidgetEventDescriptor和WidgetParameter。

客戶端應用程序既沒有這些類也沒有ObjectFactory,遠程調用服務器應用程序上的服務,得到一個XML,如:

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

幸運的是,客戶端應用程序可以訪問.xsd定義。 我的問題是:有可能,使用xml內容和xsd定義,為widgetEventCall,widgetEventDescriptor和widgetParameter創建對象,就好像它們是由xjc創建的,包括getter和setter,保持客戶端應用程序不知道它們,使用專屬反思? 是否有一種自動化方式可以達到此目的?

我的目標是將此結果用於JSP文件,即將對象放入請求並像widgetEventCall.widgetParameter [0] .someProperty一樣訪問它,因此我需要生成getter。

提前致謝。
瓊。

您可以將EclipseLink MOXy的Dynamic JAXB用於此用例(我是MOXy技術主管)。

創建動態JAXB上下文:

JAXBContext可以從XML引導:

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

解組XML:

然后使用unmarshaller將XML轉換為對象:

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

與數據交互:

您獲得的DynamicEntity實例是一個通用對象,其get / set方法采用屬性名稱。 屬性名稱對應於XJC在靜態類上生成的內容。

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

元帥元素:

然后使用marshaller將XML轉換為對象:

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

有關更多信息,請參閱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM