JAXB: сериализовать поле перечисления в элемент xml - PullRequest
0 голосов
/ 14 июля 2020

У меня проблема с маршалингом следующего класса, у которого есть поле перечисления:

@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "request")
public class Person {

    @XmlElementRef(name = "abc")
    private Action action;

    public enum Action {
        JUMP("jumpQuickly"),
        RUN("runSlowly");

        private String actionName;

        Action(String actionName) {
            this.actionName = actionName;
        }

        public String getActionName() {
            return this.actionName;
        }
    }
}

Я также пробовал @XmlElement, я прочитал много ответов здесь, в stackoverflow, но все равно не смог с этим. Я хочу, чтобы поле Action было сериализовано в элемент xml в соответствии с actionName. Вот как я пробовал @XmlElementDecl и @XmlElementRef вместе

@XmlRegistry
public class XmlObjectFactory {

    @XmlElementDecl(name = "abc")
    public JAXBElement<String> createAction(Person.Action value) {
        return new JAXBElement<String>(new QName("action"), String.class, value.getActionName());
    }
}
Person persons = new Person();
persons.setAction(Person.Action.RUN);
JAXBContext context = JAXBContext.newInstance(Person.class, XmlObjectFactory.class);
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(persons, System.out);

Я хочу, чтобы было сгенерировано следующее XML:

<?xml version="1.0"?>
<request>
  <action>
    <runSlowly/>
  </action>
</request>

Однако я получаю следующее исключение:

Invalid @XmlElementRef : Type "class <package>Person$Action" or any of its subclasses are not known to this context.
    this problem is related to the following location:
        at private <package>.Person$Action <package>.Person.action
        at <package>.Person

Я пытался добавить @XmlSeeAlso(Person.Action.class) в класс Person, но это не помогло.

Буду признателен за любую помощь. Заранее спасибо!

...