Java JAXB:处理根元素

Java JAXB:处理根元素,java,xml,jaxb,Java,Xml,Jaxb,对于不同的Rest调用,我有不同的响应类。但它们都与同一实体打交道。 最初,我因为没有从响应类中告诉JaxB实体类而受到责备。它是通过使用@xmlseeals{Entity.class}解决的。现在,我正试图修复根元素名称作为响应 类别1: 预期的反应是 如何将root添加到上述响应类中。 问题2: 在这种情况下,预期响应没有任何根元素。预期的响应xml仅从开始。 尝试将@xmltransive与@XmlRootElement一起用于问题1,但没有成功。您需要将实体类包装在分别定义响应和实体的根

对于不同的Rest调用,我有不同的响应类。但它们都与同一实体打交道。 最初,我因为没有从响应类中告诉JaxB实体类而受到责备。它是通过使用@xmlseeals{Entity.class}解决的。现在,我正试图修复根元素名称作为响应 类别1:

预期的反应是 如何将root添加到上述响应类中。 问题2:

在这种情况下,预期响应没有任何根元素。预期的响应xml仅从开始。 尝试将@xmltransive与@XmlRootElement一起用于问题1,但没有成功。

您需要将实体类包装在分别定义响应和实体的根元素的类中

一些基本的东西,比如:

// 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; }
}
生成以下输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Response>
    <Entities>
        <Entity id="1"/>
        <Entity id="2"/>
        <Entity id="3"/>
    </Entities>
</Response>
我想这会让你更接近你的目标

// 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>