Как я могу использовать JAXB @XmlValue на подклассе?



Я хочу XML вот так:



<simple>Foo</simple>


Я могу сделать это успешно с помощью класса JAXB, который выглядит следующим образом:



@XmlRootElement(name="simple")
class Simple {
@XmlValue
public String contents;
}


Но теперь мне нужно сделать простой класс подклассом другого класса, например:



@XmlRootElement(name="simple")
class Simple extends OtherClass {
@XmlValue
public String contents;
}


Это не удается с @XmlValue is not allowed on a class that derives another class. я не могу легко рефакторировать суперкласс (из-за того, как мы используем @XmlElementRef на классе-оболочке). Есть ли обходной путь, который позволит мне аннотировать мой подкласс для создания этого простого XML?

504   4  

4 ответов:

Примечание: я EclipseLink JAXB (MOXy) ведущий и член группы JAXB 2 (JSR-222) экспертная группа.

Этот вариант использования поддерживается MOXy, а IMHO также должен поддерживаться JAXB RI:

Простой

Этот класс имеет поле, сопоставленное с @XmlValue и расширяющееся OtherClass:

package forum809827;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;

@XmlRootElement(name="simple")
class Simple extends OtherClass {

    @XmlValue
    // @XmlValueExtension
    // As of moxy 2.6, XmlValueExtension needs to be added for this to work
    public String contents;

}

OtherClass

Это и есть суперкласс. В MOXy подкласс может отображать поле / свойство с @XmlValue как пока суперкласс не имеет никаких сопоставлений с XML-элементом:
package forum809827;

import javax.xml.bind.annotation.XmlAttribute;

public class OtherClass {

    @XmlAttribute
    public String other;

}

Демо

package forum809827;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Simple.class);

        Simple simple = new Simple();
        simple.contents = "FOO";
        simple.other = "BAR";

        Marshaller marshaller = jc.createMarshaller();
        marshaller.marshal(simple, System.out);
    }

}

Вывод

<?xml version="1.0" encoding="UTF-8"?>
<simple xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" other="BAR">FOO</simple>

Для получения дополнительной информации об указании MOXy в качестве поставщика JAXB

Принятый ответ не сработал для меня.

Все в порядке, как описано, но мне также нужно было добавить @XmlTransient в суперкласс

Я смог сделать эту работу, изменив @XmlValue на @XmlMixed и изменив переменную на список. Полученный класс должен выглядеть следующим образом.

@XmlRootElement(name="simple")
class Simple extends OtherClass {
    @XmlMixed
    public List<String> contents;
}

Эта проблема случилась со мной и заняла у меня немного времени. Благодаря Блез Doughan Я просматриваю его блог и нахожу ответ

  1. Вы должны добавить a Джакс.файл свойств с javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory в том же пакете для того, чтобы использовать MOXy

  2. Добавить Moxy, чтобы ваш зависимостей Maven или добавить характер фляги

    <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.moxy</artifactId> <version>2.5.0</version> </dependency>

  3. Тогда все готово У меня есть образец здесь вы можете пойти хотя мой проект и посмотреть около https://github.com/cicidi/HelloCCD/tree/master/Jaxb

Comments

    Ничего не найдено.