Динамический Java-бин от XSD - PullRequest
       37

Динамический Java-бин от XSD

5 голосов
/ 19 октября 2010

У меня есть два приложения, одно из которых выступает в качестве клиента, а другое - в качестве сервера.В серверном приложении я генерирую ObjectFactory и классы, используя xjc из Eclipse.В результате один из этих классов называется 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 с их геттерами и сеттерами.

Клиентское приложение, которое не имеет ни этих классов, ниObjectFactory удаленно вызывает службу в серверном приложении, получая в результате один XML, например:

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

К счастью, клиентское приложение имеет доступ к определению .xsd.Мой вопрос: возможно, имея содержимое xml и определение xsd, создавать объекты для widgetEventCall, widgetEventDescriptor и widgetParameter, как если бы они были созданы xjc, включая методы получения и установки, сохраняя клиентское приложение без их ведома, используяисключительно отражение?Есть ли один автоматизированный способ достичь этого?

Моя цель состоит в том, чтобы использовать этот результат в файле JSP, то есть поместить объект в запрос и обращаться к нему как widgetEventCall.widgetParameter [0] .someProperty, поэтому мне нужнодолжны быть созданы геттеры.

Заранее спасибо.
Джоан.

1 Ответ

7 голосов
/ 19 октября 2010

Вы можете использовать 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 вobjects:

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);

Маршал объекта:

Затем вы используете маршаллер для преобразованияXML в объекты:

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

Для получения дополнительной информации см .:

...