Как я могу использовать 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?
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 Я просматриваю его блог и нахожу ответ
Вы должны добавить a Джакс.файл свойств с
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactoryв том же пакете для того, чтобы использовать MOXyДобавить Moxy, чтобы ваш зависимостей Maven или добавить характер фляги
<dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.moxy</artifactId> <version>2.5.0</version> </dependency>Тогда все готово У меня есть образец здесь вы можете пойти хотя мой проект и посмотреть около https://github.com/cicidi/HelloCCD/tree/master/Jaxb
Comments