Привязка JAXB classImpl (чтобы использовать определенный impl, который расширяет сгенерированный impl), но getter возвращает супер тип - PullRequest
3 голосов
/ 16 июня 2011

, чтобы обернуть некоторые сгенерированные классы, я использую привязку classImpl, но коллекции в сгенерированных классах возвращают сгенерированный тип вместо типа в classImpl, и я, конечно, хочу список classImpl ...

my xsd:

<complexType name="A">
<xs:sequence>
    <element name="listB" type="sbs:B" minOccurs="0" maxOccurs="unbounded"></element>
    <element name="singleB" type="sbs:B" minOccurs="1" maxOccurs="1"></element>
</xs:sequence>
</complexType>
<complexType name="B">
<xs:annotation><xs:appinfo>
    <jxb:class implClass="BWrapper" />
</xs:appinfo></xs:annotation>
</complexType>

сгенерированные классы:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "A", propOrder = {
    "listB",
    "singleB"
})
public class A {
    @XmlElement(type = BWrapper.class)
    protected List<B> listB;
    @XmlElement(required = true, type = BWrapper.class)
    protected BWrapper singleB;

, поскольку ожидаемый singleB набирается BWrapper, поэтому, почему listB - это список B вместо списка BWrapper ???

заранее спасибо за помощь !!

Ответы [ 2 ]

1 голос
/ 13 января 2016

Вы определили, что тип может быть реализован BWrapper. Вы должны явно сказать, что элемент listB должен ссылаться на BWrapper.

Я не мог понять, как установить эту строку в схеме, поэтому мне пришлось использовать внешний файл .xjb.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings version="2.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
    <!-- bindings in the scope of the schema -->
    <jaxb:bindings schemaLocation="./Test.xsd" node="/xs:schema">

        <!-- apply bindings in the scope of the complex type B. -->
        <jaxb:bindings node="//xs:complexType[@name='B']">
            <!-- the java BWrapper extends the B object created by XJC -->
            <jaxb:class implClass="com.foobar.BWrapper"/>
        </jaxb:bindings>

        <!-- specify bindings in the scope of the element 'listB' within -->
        <!-- the the complex type A -->
        <jaxb:bindings node="//xs:complexType[@name='A']//xs:element[@name='listB']">
            <!-- the element should reference the BWrapper cLass -->
            <jaxb:class ref="com.foobar.BWrapper"/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

Это сгенерирует:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "A", propOrder = {
    "listB",
    "singleB"
})
public class A {
    protected List<com.foobar.BWrapper> listB;
    @XmlElement(required = true, type = com.foobar.BWrapper.class)
    protected com.foobar.BWrapper singleB;

И получатель для listB возвращает список BWrappers. Я не уверен, почему существует такое несоответствие между отдельными элементами и списками, но по крайней мере это работает.

0 голосов
/ 16 июня 2011

Свойство type в @XmlElement является правильным способом настройки реализации JAXB (Metro, MOXy, JaxMe и т. Д.) Для этого варианта использования. Вы все еще видите проблему, если добавляете аннотацию XmlAccessorType в свой класс?

@XmlAccessorType(XmlAccessType.FIELD)
public class A {
    @XmlElement(type = BWrapper.class)
    protected List<B> listB;
    @XmlElement(required = true, type = BWrapper.class)
    protected BWrapper singleB;
}

Например, см .:

...