У меня есть следующее в схеме, определяющей объекты запроса / ответа, используемые в моем запросе веб-службы:
<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, чтобы правильно демаршировать подклассы абстрактных родительских классов?