来自xsd的动态java bean

时间:2010-10-19 10:40:28

标签: java dynamic xsd jaxb javabeans

我有两个应用程序,一个作为客户端,另一个作为服务器。在服务器应用程序中,我使用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生成类WidgetEventCall,WidgetEventDescriptor和WidgetParameter及其getter和setter。

客户端应用程序(既没有这些类也没有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。

提前致谢。
琼。

1 个答案:

答案 0 :(得分:7)

您可以将EclipseLink MOXy的动态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);

有关详细信息,请参阅: