【问题标题】:Spring-WS JAXB without XML annotations or how to use a class that cannot be modifiedSpring-WS JAXB 没有 XML 注解或者如何使用无法修改的类
【发布时间】:2014-10-16 02:41:26
【问题描述】:

对于 Spring-WS,我需要使用无法修改的类,这意味着我无法添加 XML 注释。有没有办法在没有 XML 注释但使用 JAXB marshaller/unmarshaller 的情况下使用这些类?我可以使用 XSD 生成新类,然后执行类似“将值从请求传递到生成的类,然后从生成的类传递给我无法修改的类(使用此类执行所有逻辑),然后将结果传递给生成的类并回复”。但我认为这应该是其他方式来做到这一点。在 Castor 中有一个映射,在 JAXB 中有相同的东西吗? 谢谢

【问题讨论】:

    标签: xml web-services jaxb spring-ws


    【解决方案1】:

    您可以通过MOXy 实现此目的。

    除了标准的 JAXB 注释之外,EclipseLink 还提供了另一个 表达元数据的方式:EclipseLink XML 绑定 文档。 XML 绑定不仅可以分离您的映射信息 从您实际的 Java 类中,它也可以用于更高级的 元数据任务,例如:

    • 使用其他映射信息扩充或覆盖现有注释
    • 在外部指定所有映射信息,在 Java 中完全没有注释
    • 定义跨多个绑定文档的映射指定不对应于具体 Java 字段的“虚拟”映射和 更多。

    我曾经在Annox 中为 JAXB RI 编写过类似的实现,请看here。在这两种情况下,想法都是将映射放在 XML 文件中而不是注释中。我不知道 MOXy 是怎么做到的。 Annox 提供了一个“注释阅读器”,它读取 XML 资源而不是注释。下面是典型的purchase order 示例:

    final AnnotationReader<Type, Class, Field, Method> annotationReader = new AnnoxAnnotationReader();
    
    final Map<String, Object> properties = new HashMap<String, Object>();
    
    properties.put(JAXBRIContext.ANNOTATION_READER, annotationReader);
    
    final JAXBContext context = JAXBContext.newInstance(
        "org.jvnet.annox.samples.po",
        Thread.currentThread().getContextClassLoader(),
        properties);
    
    final Object myObject = context.createUnmarshaller().unmarshal( ... );
    

    classpath:org/jvnet/annox/samples/po/package-info.ann.xml.

    <package xmlns="http://annox.dev.java.net" xmlns:annox="http://annox.dev.java.net" xmlns:jaxb="http://annox.dev.java.net/javax.xml.bind.annotation"
        xmlns:adap="http://annox.dev.java.net/javax.xml.bind.annotation.adapters">
    
        <adap:XmlJavaTypeAdapters>
            <adap:XmlJavaTypeAdapter value="org.jvnet.annox.samples.po.BigDecimalAdapter" type="java.math.BigDecimal" />
        </adap:XmlJavaTypeAdapters>
    
        <class name="ObjectFactory">
            <jaxb:XmlRegistry />
            <method name="createPurchaseOrder">
                <jaxb:XmlElementDecl namespace="" name="purchaseOrder" />
            </method>
            <method name="createComment">
                <jaxb:XmlElementDecl namespace="" name="comment" />
            </method>
        </class>
        <class name="PurchaseOrderType">
            <jaxb:XmlAccessorType value="FIELD" />
            <jaxb:XmlType name="PurchaseOrderType" propOrder="shipTo billTo comment items" />
            <field name="shipTo">
                <jaxb:XmlElement required="true" />
            </field>
            <field name="billTo">
                <jaxb:XmlElement required="true" />
            </field>
            <field name="items">
                <jaxb:XmlElement required="true" />
            </field>
            <field name="orderDate">
                <jaxb:XmlAttribute />
                <jaxb:XmlSchemaType name="date" />
            </field>
        </class>
        <class name="Items">
            <jaxb:XmlAccessorType value="FIELD" />
            <jaxb:XmlType name="Items" propOrder="item" />
        </class>
    </package>
    

    classpath:org/jvnet/annox/samples/po/Items$Item.ann.xml:

    <class xmlns="http://annox.dev.java.net" xmlns:annox="http://annox.dev.java.net" xmlns:jaxb="http://annox.dev.java.net/javax.xml.bind.annotation">
    
        <jaxb:XmlAccessorType value="FIELD"/>
        <jaxb:XmlType name="" propOrder="productName quantity usPrice comment shipDate"/>
        <field name="productName">
            <jaxb:XmlElement required="true"/>
        </field>
        <field name="usPrice">
            <jaxb:XmlElement name="USPrice" required="true"/>
        </field>
        <field name="shipDate">
            <jaxb:XmlSchemaType name="date"/>
        </field>
        <field name="partNum">
            <jaxb:XmlAttribute required="true"/>
        </field>
    </class>
    

    如果您可以使用 MOXy,我建议您使用 MOXy,因为它绝对是主流。

    免责声明:我是 Annox 的作者,它恰好是适合这种情况的工具。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 2011-09-30
      • 2018-05-23
      • 1970-01-01
      相关资源
      最近更新 更多