【问题标题】:XSD design issues in JavaJava 中的 XSD 设计问题
【发布时间】:2011-04-25 15:01:41
【问题描述】:

目前我们的软件正在通过 XML/SOAP 与远程 Web 服务进行交互。我们使用 XSD 来方便地创建要发送到远程系统的请求。这很好,而且运行良好。 XSD 非常棒。

但是,它确实会导致用于创建 Document 对象的代码块非常冗长。我想知道是否有人对处理这些大型代码块以创建请求和处理响应文档的良好设计实践有建议。

XSD Document 对象的意义在于将 XML 创建与客户端分离。但是,我认为外观类可能对每个服务都是一个好主意。我认为这对于创建来说非常有用,因为可以为外观类提供构建请求文档和发送请求的成分,而无需将客户端耦合到 XSD 类。我认为响应文档中出现了问题。如果有一个多级响应,您最终将创建 POJO 类只是为了包装 XSD 类,这似乎有点过头了。

【问题讨论】:

  • 您没有使用 JAXB 有什么特别的原因吗? XJC 工具将为您创建 POJO 类...
  • @perp - 我是。 POJO 类“导致用于创建 Document 对象的代码块非常冗长。”
  • EclipseLink JAXB (MOXy) 实现有一个 XPath 映射扩展,可以减小代码块的大小:stackoverflow.com/questions/5779696/xsd-design-issues-in-java/…

标签: java xml soap xsd


【解决方案1】:

注意:我是 EclipseLink JAXB (MOXy) 技术主管。

EclipseLink JAXB (MOXy)

MOXy 是一个 JAXB (JSR-222) 实现,具有基于 XPath 的映射扩展。这意味着您可以将更紧凑的对象模型映射到您的 XML。在下面的示例中,一个简单的 Address 对象被映射为 Google's Geocoding 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> 

更多信息

【讨论】:

  • 这是很棒的信息!我将专门研究元数据映射文件。当您有一个不断变化的 WSDL 时,最好将 XML 模式与源分离(避免注释)。我认为这对我们来说是一个很好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2014-02-18
相关资源
最近更新 更多