【问题标题】:Dynamic java bean from xsd来自 xsd 的动态 java bean
【发布时间】:2011-04-27 10:02:36
【问题描述】:

我有两个应用程序,一个作为客户端,另一个作为服务器。在服务器应用程序中,我使用 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。

提前致谢。
琼。

【问题讨论】:

    标签: java dynamic xsd jaxb javabeans


    【解决方案1】:

    对于这个用例,您可以使用 EclipseLink MOXy 的 Dynamic JAXB(我是 MOXy 技术负责人)。

    创建动态 JAXB 上下文:

    可以从 XML 引导 JAXBContext:

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

    解组 XML:

    然后您使用解组器将 XML 转换为对象:

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

    与数据交互:

    您返回的 DynamicEntity 实例是一个具有获取/设置方法的通用对象,该方法采用属性名称。属性名称对应于 XJC 在静态类上生成的名称。

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

    封送对象:

    然后您使用编组器将 XML 转换为对象:

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

    欲了解更多信息,请参阅:

    【讨论】:

    • 这看起来很棒!我会试试看,但恐怕我无法将新的 jar 库添加到我的应用程序中:(非常感谢您的帮助。琼。
    • 恐怕这个答案中的链接不再有效。
    • 我们能否也为使用 Moxy 的标签添加属性
    猜你喜欢
    • 2011-06-06
    • 2015-08-08
    • 1970-01-01
    • 2011-01-29
    • 2012-05-19
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多