Как использовать JAXB @XmlValue на подклассе? - PullRequest
14 голосов
/ 11 ноября 2011

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

<simple>Foo</simple>

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

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

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

@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 ]

13 голосов
/ 05 марта 2014

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

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

7 голосов
/ 11 ноября 2011

Примечание: Я 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;

}

Demo

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

0 голосов
/ 14 мая 2015

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

  1. . Чтобы использовать MOXy

    , вам нужно добавить файл jaxb.properties с javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory в тот же пакет.
  2. добавить moxy к вашей зависимости maven или добавить moxy jar

    <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

0 голосов
/ 04 марта 2015

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

@XmlRootElement(name="simple")
class Simple extends OtherClass {
    @XmlMixed
    public List<String> contents;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...