Проблемы проектирования XSD в Java - PullRequest
2 голосов
/ 25 апреля 2011

В настоящее время наше программное обеспечение взаимодействует с удаленным веб-сервисом через XML / SOAP. Мы используем XSD для удобного создания запросов для отправки в удаленную систему. Это хорошо, и это работает хорошо. XSD довольно крутой.

Однако это приводит к очень длинным кодовым блокам для создания объектов Document. Мне интересно, есть ли у кого-нибудь предложения относительно хороших методов проектирования для обработки этих больших блоков кода для создания запроса и обработки ответных документов.

Смысл объекта XSD Document состоит в том, чтобы отделить создание XML от клиента. Тем не менее, я думаю, что класс фасадов может быть хорошей идеей для каждого сервиса. Я думаю, что это было бы здорово для создания, так как классу фасада можно было бы предоставить ингредиенты для построения документа запроса и отправки запроса, не связывая клиента с классами XSD. Я думаю, что проблема возникает в ответных документах. Если есть многоуровневый ответ, вы в конечном итоге создадите классы POJO просто для того, чтобы обернуть классы XSD, что кажется чрезмерным уничтожением.

1 Ответ

1 голос
/ 29 апреля 2011

Примечание: Я технический лидер EclipseLink JAXB (MOXy).

EclipseLink JAXB (MOXy)

MOXy - это реализация JAXB ( JSR-222 ), которая имеет расширение отображения на основе XPath.Это означает, что вы можете сопоставить более компактную объектную модель с вашим XML.В приведенном ниже примере простой объект Address сопоставлен с форматом геокодирования Google V2 :

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement(name="kml")
@XmlType(propOrder={"country", "state", "city", "street", "postalCode"})
public class Address {

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:Thoroughfare/ns:ThoroughfareName/text()")
    private String street;

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:LocalityName/text()")
    private String city;

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:AdministrativeAreaName/text()")
    private String state;

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:CountryNameCode/text()")
    private String country;

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:PostalCode/ns:PostalCodeNumber/text()")
    private String postalCode;

}

Приведенный выше класс соответствует следующему XML:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.0" xmlns:ns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0">
    <Response>
        <Placemark>
            <ns:AddressDetails>
                <ns:Country>
                    <ns:CountryNameCode>US</ns:CountryNameCode>
                    <ns:AdministrativeArea>
                        <ns:AdministrativeAreaName>CA</ns:AdministrativeAreaName>
                        <ns:SubAdministrativeArea>
                            <ns:Locality>
                                <ns:LocalityName>Mountain View</ns:LocalityName>
                                <ns:Thoroughfare>
                                    <ns:ThoroughfareName>1600 Amphitheatre Pkwy</ns:ThoroughfareName>
                                </ns:Thoroughfare>
                                <ns:PostalCode>
                                    <ns:PostalCodeNumber>94043</ns:PostalCodeNumber>
                                </ns:PostalCode>
                            </ns:Locality>
                        </ns:SubAdministrativeArea>
                    </ns:AdministrativeArea>
                </ns:Country>
            </ns:AddressDetails>
        </Placemark>
    </Response>
</kml> 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...