【问题标题】:Marshalling List<String> with JAX-RS使用 JAX-RS 编组列表<String>
【发布时间】:2012-10-25 12:57:58
【问题描述】:

我习惯于使用生成 wsdl 文件的 jax-ws,然后可以使用 maven 插件基于此 wsdl 文件及其 xsd 生成客户端。使用这个客户端一点也不麻烦,而且你不必真正考虑后台发生的事情,比如编组、http 传输等。

我目前正在开发一个使用 jaxb 来解组对象的 jax-rs 项目。那里的一种方法返回一个字符串列表,但似乎 jaxb 不知道如何编组这个,这有点令人惊讶,因为它确实知道如何编组一个实体列表(例如,客户)。

另外,我自己为 jax-rs 服务编写了一个客户端,处理 http 响应和使用 jaxb 对有效负载进行解组。使用 jaxb 编组和解组确实很麻烦,因为它不能自动编组或解组添加到其上下文中的实体列表,更不用说字符串列表。

我想知道是否有一些巧妙的方法可以使用 RESTful Web 服务免费获得所有这些?这必须非常轻量级,并且客户端必须易于分发。

谢谢! 卢纳尔

使用 jaxrs 和 jaxb 不起作用的服务方法:

@GET
@Path("/{customerId}")
@Produces(MediaType.APPLICATION_XML)
public List<String> isCustomerLocked(@PathParam("customerId") Long customerId) {


}

尝试编组/解组文本负载的客户端代码。添加到 jaxbcontext 的类未显示:

javax.xml.bind.Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.marshal(obj, stringwriter)

javax.xml.bind.Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
unmarshaller.unmarshal(inputstream)

【问题讨论】:

  • 在您看来,List&lt;String&gt; 的自然 XML 应该是什么?编组器应该如何知道你想要什么?
  • 好吧,我希望它是一致的。当它编组一个客户实体列表时,它会创建一个新的根元素 &lt;customers&gt;,并在其下方包含所有 &lt;customer&gt; 元素。为什么它不能对原始数据类型和字符串做同样的事情?喜欢&lt;Strings&gt;&lt;string&gt;..
  • 您的Customer 可能有 JAXB 注释。 String 没有,所以你必须把它包装起来或者写一个Provider。

标签: rest jaxb marshalling jax-rs


【解决方案1】:

我会使用 JAXB 来包装数据。对于一个简单的List&lt;String&gt;,这可能看起来有点矫枉过正。但在大多数情况下,您希望取消/编组资源表示,而不是简单的对象。

记住:REST 不是 RPC!

如果你真的想要 tom un-/marshall List&lt;String&gt; 写一个 JAX-RS Provider。但我更喜欢使用 JAXB。

S.java

@XmlRootElement
public class S {

    private String s;

    public S() {
    }

    public S(String s) {
        this.s = s;
    }

    public String getS() {
        return s;
    }

    public void setS(String s) {
        this.s = s;
    }
}

Ss.java

@XmlRootElement(name="ss-wrapper")
public class Ss {

    private List<S> ss;

    public List<S> getSs() {
        return ss;
    }

    public void setSs(List<S> ss) {
        this.ss = ss;
    }

    public Ss(List<S> ss) {
        this.ss = ss;
    }

    public Ss() {
    }
}

JAX-RS 类

@Path("/strings")
@GET
@Produces(MediaType.APPLICATION_XML)
public Response getListOfStrings() {
    S s1 = new S("foo");
    S s2 = new S("bar");
    List<S> strings = new ArrayList<S>();
    strings.add(s1);
    strings.add(s2);
    Ss ss = new Ss(strings);
    return Response.ok(ss).build();
}

XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ss-wrapper>
  <ss>
    <s>foo</s>
  </ss>
  <ss>
    <s>bar</s>
  </ss>
</ss-wrapper>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多