У меня разные классы Response
для разных вызовов Rest. Но все они имеют дело с одной и той же Entity
. Вначале я собирался не сообщать JaxB о классе Entity из класса Response. Он был разрешен с помощью @XmlSeeAlso({Entity.class})
. Теперь я пытаюсь исправить имя корневого элемента в классе Response
.
Issue1:
@XmlRootElement(name="?")
@XmlSeeAlso({Entity.class})
public class FindAllResponse
extends ListResponse<Entity>
{
/**
* serial version uid
*/
private static final long serialVersionUID = xxx;
}
Ожидаемый ответ <Response> <Entities> <Entity></Entity> </Entities> <Response>
Как добавить класс <Response><Entities>
в класс ответа выше.
Issue2:
@XmlRootElement(name="?")
@XmlSeeAlso({Entity.class})
public class FindEntityResponse
extends Response<JobType>
{
@JsonUnwrapped
public Entity getValue() {
return super.getValue();
}
}
В этом случае ожидаемый ответ не имеет корневого элемента. Ожидаемый ответ xml начинается с <Entity></Entity>
.
Пробовал использовать @XmlTransient
с @XmlRootElement
для @XmlRootElement
1, но не повезло.
Вам необходимо обернуть класс Entity
в классы, которые определяют корневые элементы для Response
и Entities
соответственно.
Что-то рудиментарное:
// this class will represent your Response element and all attributes
@XmlRootElement(name="Response")
@XmlAccessorType(XmlAccessType.FIELD)
public class Response {
@XmlElement(name="Entities")
private Entities myEntities;
public Response() {
myEntities = new Entities();
}
public Entities getMyEntities() { return myEntities; }
public void setMyEntities(Entities entities) { this.myEntities = entities; }
}
// this class will represent the collection of Entities
@XmlRootElement(name="Entities")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entities {
@XmlElement(name="Entity")
private List<Entity> entities;
public Entities() {
entities = new ArrayList<Entity>();
}
public List<Entity> getEntities() { return this.entities; }
public void setEntities(List<Entity> entities) { this.entities = entities; }
}
// a simple Entity class (I don't know what yours is)
@XmlRootElement(name="Entity")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entity {
@XmlAttribute(name="id")
private String id;
public Entity() {}
public Entity(String id) { setId(id); }
public String getId() { return id; }
public void setId(String id) { this.id = id; }
}
Наконец, простой тест:
public class Test {
public static void main(String[] args) throws Exception {
Response r = new Response();
Entities e = new Entities();
e.getEntities().add(new Entity("1"));
e.getEntities().add(new Entity("2"));
e.getEntities().add(new Entity("3"));
r.setMyEntities(e);
JAXBContext context = JAXBContext.newInstance(Response.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(r, System.out);
}
}
Производит следующий вывод:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Response>
<Entities>
<Entity id="1"/>
<Entity id="2"/>
<Entity id="3"/>
</Entities>
</Response>
Думаю, это приблизит вас к тому, что вам нужно.