我有两个应用程序,一个作为客户端,另一个作为服务器。在服务器应用程序中,我使用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。
提前致谢。
琼。
答案 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);
有关详细信息,请参阅: