【问题标题】:Using Spring-WS and JAXB: can't unmarshall subclasses in XML request使用 Spring-WS 和 JAXB:不能在 XML 请求中解组子类
【发布时间】:2011-10-11 17:21:08
【问题描述】:

我在定义 Web 服务请求中使用的请求/响应对象的架构中有以下内容:

<xs:complexType name="loss" abstract="true">
    <xs:sequence>
        <xs:element name="lossDate" type="xs:dateTime"/>
        <xs:element name="lossDescription" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="autoLoss">
    <xs:complexContent>
        <xs:extension base="loss">
            <xs:sequence>
                <!-- autoLoss specific fields... -->
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="propLoss">
    <xs:complexContent>
        <xs:extension base="loss">
            <xs:sequence>
                <xs:element name="damageDescription" type="xs:string"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

及其相关的 Java 类:

@XmlType
public abstract class Loss {
    private Date lossDate;
    private String lossDescription;
    //getter & setters w/ JAXB annotations
}

@XmlType
public class AutoLoss extends Loss {
    //AutoLoss-specific fields...
    //getter & setters w/ JAXB annotations
}

@XmlType
public class PropLoss extends Loss {
    private String damageDescription;
    //getter & setters w/ JAXB annotations
}

我发送的 XML 请求:

<testRequest>
    <myLoss xsi:type="propLoss">
        <lossDate>2001-12-17T09:30:47Z</lossDate>
        <lossDescription>test</lossDescription>
        <damageDescription>damageDesc</damageDescription>
    </myLoss>
</testRequest>

Jaxb2Marshaller的Spring bean定义:

<bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="classesToBeBound">
        <!-- list of classes... -->
    </property>
    <property name="schema" value="/WEB-INF/mySchema.xsd" />
    <property name="adapters">
        <list>
            <bean class="com.lmig.ContactAdapter" />
        </list>
    </property>
</bean>

但是,我在回复中遇到了错误:Unable to create an instance of com.lmig.Loss。如果我删除Loss 上的abstract 修饰符,则未编组的响应对象属于基类类型(Loss)。如何使用 Spring-WS 和 JAXB 正确解组抽象父类的子类?

【问题讨论】:

    标签: web-services jaxb spring-ws unmarshalling jaxb2


    【解决方案1】:

    您的层次结构中的每个类都有一个@XmlJavaTypeAdapter。下面是一个答案的链接,我在其中演示了如何混合继承和XmlAdapter

    有关 JAXB 和继承的更多信息:

    有关 JAXB 和XmlAdapter的更多信息

    【讨论】:

    • 谢谢布莱斯。但是,我不认为我的XmlAdapter 是造成这种情况的原因。当 JAXB 尝试解组一个没有 @XmlJavaTypeAdapter 的子类时,我得到了同样的错误。我已经更新了我原来的问题以反映这一点,所以希望我更清楚。
    • @holic87 - 你的JAXBContext 知道子类吗?您可以在创建 JAXBContext 时将它们作为参数传递,也可以将 @XmlSeeAlso 注释添加到引用其所有子类的 Loss 类。
    • 是的,我已经在 Jaxb2Marshaller Spring bean 的 propertiesToBeBound 属性中包含了类列表,包括所有基类和子类。此外,如果我从基类中删除 abstract 修饰符,我说 null 对象被解组是不正确的:结果 just 基类正在被解组。我已经更新了我原来的问题以反映这一点。
    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 2011-07-03
    • 2013-01-17
    相关资源
    最近更新 更多