代码之家  ›  专栏  ›  技术社区  ›  Taylor Gautier

如何通过REST和JAX-RS对父子实体建模

  •  4
  • Taylor Gautier  · 技术社区  · 16 年前

    我正在开发一个基于REST的API,在弄清楚什么是表示父/子关系的标准方法时遇到了一些困难。(我正在用CXF编写bean,并使用JAX-RS和JAXB。我从CXF提供的基本示例开始)

    我的问题是,假设你有一个Foo和一个酒吧。Foo和Bar之间存在1-N关系,即1foo有许多条。我的问题是,找出一个Foo有哪些酒吧的标准方法是什么?访问Foo拥有的酒吧资源的标准方式是什么?

    例如,我发现我可能会在以下位置列出foo:

    得到 http://xxx/fooservice/foos

    并在以下位置对单个foo进行操作:

    放置/更新/删除 http://xxx/fooservice/foo/ {fooid}

    但是我如何列出Foo 121拥有的酒吧呢?我如何访问它们?我注意到,默认的JAXB marshaller似乎不输出集合,只输出bean的属性,因此如果一个Foo是:

    Foo
      - String id
      - String name
      - Collection bars
    

    JAXB的输出类似于:

    <foo>&书信电报;id>123>/id>&书信电报;名称>foo name</名称></foo><——请注意,缺少bars属性

    这是有问题的,因为客户无法合理地期望知道Foo有酒吧,除非它“只是知道”(这对我来说很糟糕)。因此,虽然我可以想象使用以下方法获得酒吧列表:

    http://xxx/fooservice/foo/121/bars

    如果实体的输出没有说明,客户机怎么知道Foo有条呢?现在假设客户机确实获得了列表,那么实体操作似乎如下所示:

    http://xxx/fooservice/foo/121/bar/435

    这将访问Foo 121拥有的酒吧435。

    4 回复  |  直到 16 年前
        1
  •  10
  •   Jim Ferrans    14 年前

    你想做的事当然是可能的。设计资源的一种方法是:

    /foo
              # A list of all the Foo resource names (not representations).
    
    /foo/{fooid}
              # A detailed representation of a particular Foo, including 
              # a list of all that Foo's Bar resource names (not representations).
    
    /foo/{fooid}/bar/{barid}
              # A detailed representation of a particular Bar.
    

    您可能会遇到这样一种情况:在特定的Foo之外,这些条实际上并不存在(比如在采购订单的主行和它包含的明细行中)。如果是这种情况,并且每个Foo都没有那么多的条形图数据,则可以在Foo表示中返回完整的条形图详细信息:

    /foo
              # A list of all the Foo resource names (not representations).
    
    /foo/{fooid}
              # A detailed representation of a particular Foo, including 
              #   full details on each of its Bars.
    

    不确定序列化的XML表示发生了什么,您应该用相关代码创建第二个问题。

        2
  •  0
  •   Taylor Gautier    16 年前

    谢谢你的详细帖子-你所描述的基本上已经是我正在做的事情了,没有你所建议的每个Foo中的条的详细表示,所以看起来我基本上是对的。

    我将在一个单独的Q中找出为什么Foo中的条集合没有像您建议的那样在JAXB中以XML的形式被解包。

        3
  •  0
  •   delfuego    16 年前

    Taylor,Jersey的JAX-RS实现确实会发出将其转换为XML或JSON的对象的列表属性。在我刚刚完成的一个应用程序中,UserStore对象有一个属性users,这是一个列表:

    List<User> users = new ArrayList<User>();
    

    当我使用Jersey发出UserStore的XML或JSON版本时,我会得到该属性的一个用户数组:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <users>
        <user>
            <firstName>John</firstName>
            <id>a29a377f-4329-4ec8-9459-b5b1c2efc38a</id>
            <lastName>Doe</lastName>
        </user>
        <user>
            <firstName>Jane</firstName>
            <id>bb4dad28-1263-440a-afc5-062a8566ef90</id>
            <lastName>Roe</lastName>
        </user>
    </users>
    

    {
        "user": [{
            "firstName": "John",
            "id": "a29a377f-4329-4ec8-9459-b5b1c2efc38a",
            "lastName": "Doe",
        },
        {
            "firstName": "Jane",
            "id": "bb4dad28-1263-440a-afc5-062a8566ef90",
            "lastName": "Roe",
        }]
    }
    

        4
  •  0
  •   Bassem Reda Zohdy    12 年前

    对我来说,这个问题的答案将由数据建模来驱动,对于数据建模,问题是“是否为子模型使用复合键”,如果他使用复合键,那么你必须将父id放入URI中,如果不是,子id有自己的id,而子id不是复合的,所以你只能使用带有子id的URL。

    这就是数据建模问题!!!

    推荐文章