使用jax-b的Jax-rs客户端编组实体列表

时间:2012-10-23 09:08:27

标签: jaxb jax-rs

我需要在jax-rs客户端中使用jax-b编组实体列表,而不为每个需要的实体创建一个包装类(有manny实体!)。我注意到该服务能够整理像这样的客户列表:

<customers>
    <customer>.....</customer>
    <customer>.....</customer>
</customers>

我在客户端可以通过查找所有客户节点并手动将它们添加到列表来解组。 (我想这有更好的方法吗?)

现在,真正的问题是当我想要向服务发送实体列表(例如客户)时。我想在将此字符串作为请求的有效负载写入服务之前将此列表编组为xml字符串。这不起作用,因为marshaller不知道java.util.List或其后代。

javax.xml.bind.Marshaller.marshal(list, StringWriter);
javax.xml.bind.Unmarshaller.unmarshal(org.​w3c.​dom.node)

非常感谢任何帮助!

谢谢! -Runar

编辑:

以下是客户类的摘录:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer implements Serializable {
    private String name;
    .....
}

我正在尝试编写一个轻量级客户端,不使用第三方库,而不是标准实现的一部分。因此我编写了自己的httpclient接收有效负载对象,对它们进行编组并将它们传递给请求的有效负载。收到响应后,我读取xml并将其发送到解组。如果我可以像我的jax-rs服务那样直接对字符串进行编组/解组,那将是很棒的。

1 个答案:

答案 0 :(得分:0)

好的,所以我找不到好的解决方案。但是因为我的jax-rs服务的模式似乎是生成一个名为<class name " + "s>的根节点,所以我这样做是为了能够向服务发送对象列表:

if (obj instanceof List) {
    List list = (List) obj;
    if (!list.isEmpty()) {
        // Since the jax-b marshaller does not allow to send lists directly,
        // we must attempt to create the xml as the jax-rs service would expect them,
        // wrapped with the classname pluss an s.
        String wrapper = list.get(0).getClass().getSimpleName() + "s";
        // Make first letter in class-name lower-case
        wrapper = Character.toLowerCase(wrapper.charAt(0)) +
                  (wrapper.length() > 1 ? wrapper.substring(1) : "");
        marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_FRAGMENT, true);
        writer.write("<" + wrapper + ">");
        for (Object o : (List) obj) {
            marshaller.marshal(o, writer);
        }
        writer.write("</" + wrapper + ">");
    }
} else {
    marshaller.marshal(obj, writer);
}