代码之家  ›  专栏  ›  技术社区  ›  ChssPly76

将bean属性的子集公开为REST服务的XML响应

  •  2
  • ChssPly76  · 技术社区  · 16 年前

    我不知道如何最好地解释这一点,所以这可能有点长,请容忍我。

    public interface Customer {
        public String getFirstName();
        public String getLastName();
        public Address getAddress(); // embedded bean with its own properties
        ... // lots more
    }
    

    显然,还有一个相应的实现,另外还定义了适当的setter(尽管对于某些属性,setter可能不会在接口中公开)。

    现在我有了一个客户端(iPhone应用程序),需要访问 小子集

    GET /services/customers/1234
    

    退货

    <customer>
      <firstName>Homer</firstName>
      <lastName>Simpson</lastName>
      <city>Springfield</city>
    </customer>
    

    或者甚至

    <customer firstName="Homer" lastName="Simpson" city="Springfield" />
    

    问题是-我该怎么做?我(简要地)研究了JAXB/CXF/Jersey,看起来我必须定义一个模式,基于它生成一堆类,并将数据从API实体复制到这些类。有没有办法避免这一切?

    理想情况下,我希望在我的API实体中注释适当的属性,并让它们(并且只有它们)自动编组。如果需要,我可以为web服务端点编写专用接口/实现;注释现有的一个会更好。

    我上一次使用web服务是Axis1.1倍,上一次使用iPhone是从不:-),所以任何指针都会非常感谢。

    更新: 澄清一下-我在寻找最简单的方法 将javabean属性转换为XML(或者JSON?) 没有 必须编写/生成一个额外的类来表示所述属性子集。上面的例子过于简单化了,实际上API非常广泛,涉及很多类。我 真正地 希望尽可能避免重复。

    3 回复  |  直到 16 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    网上搜索 jaxb interface 似乎表明在JAXB中使用接口是一个难题,如本文所示 java.net blog post 还有一个 stackoverflow question

    如果您的POJO是一个类而不是一个接口,那么可能会更简单。我在用 RESTEasy

    泽西岛有一个 client API front-end / client API

    看一看这个 带JAX-RS的RESTful Java 这本书涵盖了我发现有帮助的以下内容:

    • 休息服务理念
    • 各种实现的概述,包括客户端API支持
    • 代码示例

    控制器示例:

    @GET
    @Produces( { MediaType.APPLICATION_XML })
    @Path("/customers/{id}")
    public Customer getCustomer(@PathParam("id") int id) {
        ...
        return customer;
    }
    

    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Customer {
      Address address;
      String name;
    
      // annotate with XmlTransient to prevent mapping this property/type to XML
      @XmlTransient
      String ssn;
      ...
    }
    
    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Address {
      String planet;
      ...
    }
    

    XmlTransient Java doc

        2
  •  0
  •   ChadNC    16 年前

    我的首选方法是使用JAXB注释对已经拥有的类进行注释,并让绑定编译器根据已经拥有的类通过运行 schemagen 对照带注释的源文件 example here .

        3
  •  0
  •   Christopher Oezbek    16 年前

    最简单的方法是:使用一个XML序列化API,比如XStream或Simple,这是专门为这种POJO到XML的问题而设计的。选择子集并切换到属性很容易,如下所示:

    class Customer {
        @XStreamAsAttribute
        String firstName;
        @XStreamAsAttribute
        String lastName;
        @XStreamOmitField
        Address address();
    }