Использование Spring-WS и JAXB: не удается отменить сортировку подклассов в запросе XML - PullRequest
2 голосов
/ 11 октября 2011

У меня есть следующее в схеме, определяющей объекты запроса / ответа, используемые в моем запросе веб-службы:

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

Определение bean-компонента Spring для Jaxb2Marshaller:

<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.Если я удаляю модификатор abstract на Loss, объект немаршалированного ответа имеет тип базового класса (Loss).Как я могу использовать Spring-WS и JAXB, чтобы правильно демаршировать подклассы абстрактных родительских классов?

1 Ответ

2 голосов
/ 11 октября 2011

У вас есть @XmlJavaTypeAdapter для каждого класса в вашей иерархии. Ниже приведена ссылка на ответ, где я демонстрирую, как смешивать Inheritance и XmlAdapter:

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

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

...