【问题标题】:JAXB: Dealing the with Root ElementJAXB:处理根元素
【发布时间】:2014-07-09 21:34:05
【问题描述】:

对于不同的 Rest 调用,我有不同的 Response 类。但他们都处理相同的Entity。 最初我是因为没有告诉 JaxB 来自 Response 类的 Entity 类。它已通过使用@XmlSeeAlso({Entity.class}) 解决。现在我正在尝试修复 Response 中的根元素名称 类。
问题 1:

@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>
我如何将&lt;Response&gt;&lt;Entities&gt; root 添加到上面的响应类中。
问题 2:

@XmlRootElement(name="?")
@XmlSeeAlso({Entity.class})
public class FindEntityResponse 
    extends Response<JobType> 
{


    @JsonUnwrapped
    public Entity getValue() {
        return super.getValue();
    }

}

在这种情况下,预期响应没有任何根元素。预期响应 xml 只是以 &lt;Entity&gt;&lt;/Entity&gt; 开头。
尝试在第 1 期中使用 @XmlTransient@XmlRootElement,但没有成功。

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

    您需要将Entity 类包装在分别为ResponseEntities 定义根元素的类中。

    一些基本的东西:

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

    我认为这应该让你更接近你所追求的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-04
      相关资源
      最近更新 更多