Я генерирую классы из мыльной схемы, которая использует расширение типов и по умолчанию маршалы JAXB только в родительском классе. Часть сообщения мыла У меня проблема с:
<Value i:type="StringValue">
<Value>Text</Value>
</Value>
Родительский класс, который в настоящее время используется JAXB
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ParameterValueBase")
@XmlSeeAlso({
BoolValue.class,
NumberValue.class,
StringValue.class,
DateTimeValue.class,
TimeOfDayValue.class,
ListValue.class,
DurationValue.class,
DiscountPeriodValue.class
})
public class ParameterValueBase
{
}
Дочерний класс Я хочу, чтобы он был преобразован в
@XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "StringValue", propOrder = {"value"}) открытый класс StringValue extends ParameterValueBase реализует ToString2 {
@XmlElementRef(name = "Value", namespace = "http://schemas.sitels.ru/FORIS/IL/ResourceInformation", type = JAXBElement.class, required = false)
protected JAXBElement<String> value;
/**
* Gets the value of the value property.
*
* @return
* possible object is
* {@link JAXBElement }{@code <}{@link String }{@code >}
*
*/
public JAXBElement<String> getValue() {
return value;
}
}
Я ожидал, чтоЯ могу привести ParameterValueBase к StringValue. Но это дает ClassCastException. Так что, похоже, мне нужно направить эту часть сообщения прямо в StringValue. В вопросах с наследованием JAXB в большинство советов ответов вручную добавляются аннотации. Я не могу использовать его, потому что ParameterValueBase и StringValue являются сгенерированными классами. Поэтому правильным способом было бы как-то настроить маршаллера JAXB. Как я могу это сделать?
Bean Marshaller:
@Bean()
public Jaxb2Marshaller resourceMarshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("...");
return marshaller;
}
Редактировать: я обнаружил, что когда я просто копирую ответ вставки мыла в виде строки и обрабатываю его с Jaxb2Marshaller, не запуская все приложение, онона самом деле создает экземпляр StringValue. Но когда я запускаю его как весеннюю загрузку через WebServiceGatewaySupport, он почему-то создает экземпляр ParameterBaseValue. Я не уверен, что причина может быть