Сконфигурируйте маршаллера JAXB для использования дочернего класса вместо родительского без использования аннотаций - PullRequest
0 голосов
/ 23 октября 2019

Я генерирую классы из мыльной схемы, которая использует расширение типов и по умолчанию маршалы 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. Я не уверен, что причина может быть

...