У меня проблема с маршалингом следующего класса, у которого есть поле перечисления:
@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
, но это не помогло.
Буду признателен за любую помощь. Заранее спасибо!