Как моделировать сущности родителей-ребенка через отдых и jax-rs

StackOverflow https://stackoverflow.com/questions/1786795

  •  21-09-2019
  •  | 
  •  

Вопрос

Я работаю над API на основе отдыха и испытываю некоторые проблемы с выяснением канонического способа представлять отношения между родителями и ребенком. (Я пишу бобы в CXF и использую JAX-RS и JAXB. Я начал с основного примера, предоставленного CXF)

Моя проблема в том, что у вас есть Foo и бар. Существует 1-N отношения с Foo и Bar, то есть в 1 Foo много баров. У меня вопрос, каков канонический способ узнать, какие бары есть у Foo? И какой канонический способ получить доступ к ресурсам, принадлежащим Foo?

Я понял, что, например, я мог бы перечислить Foos по адресу:

ПОЛУЧИТЬ http: // xxx/fooservice/foos

И работайте на одном Foo на:

Положить/обновить/удалить http: // xxx/fooservice/foo/{fooid}

Но как мне перечислить бары, которые есть у Foo 121? И как мне получить доступ к ним? Я заметил, что кажется, что Jaxb Marshaller не выводит коллекции, просто атрибуты для бобов, поэтому, если Foo есть:

Foo
  - String id
  - String name
  - Collection bars

JAXB выводит что -то вроде:

u003Cfoo>u003Cid>123>/id>u003Cname> foo nameu003C/name>u003C/foo> <- Обратите внимание на отсутствие атрибута баров

Что проблематично, так как у клиента нет способа, чтобы можно было разумно знать, что у Foo есть бары, если только он «просто не знает» (что мне кажется плохим). Поэтому, пока я могу себе представить, чтобы получить список баров, использующих:

ПОЛУЧИТЬ http: // xxx/fooservice/foo/121/bars

Как клиент узнает, что у Foo есть бары, если результаты объекта ничего не говорят об этом? Теперь предполагая, что клиент действительно получает список, тогда, похоже, операции сущности будут что -то вроде:

Получить/удалить/обновить http: // xxx/fooservice/foo/121/bar/435

который получил бы доступ к Bar 435, принадлежащему Foo 121.

Это было полезно?

Решение

То, что вы хотите сделать, безусловно, возможно. Один из способов разработки ресурсов - это:

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

Как правило, вы хотите более грубое детализацию с ресурсами REST. Обратите внимание, что если вы выберете это, то чтобы изменить бары Foo, вы получите Foo, измените бары в представлении Foo, а затем положите Foo.

Не уверен, что происходит с вашими сериализованными представлениями XML, вы должны создать второй вопрос с соответствующим кодом.

Другие советы

Спасибо за подробный пост - то, что вы описываете, в основном уже то, что я делаю без подробного представления батончиков внутри каждого Foo, как вы предлагаете, так что кажется, что я в основном правильно.

Я узнаю, почему коллекция батончиков внутри Foo не становится безрассудным как XML в JAXB в отдельном Q, как вы предлагаете.

Тейлор, реализация Джерси JAX-RS, безусловно, выпускает свойства списка объектов, которые он преобразует в XML или JSON. Итак, в приложении, которое я только что закончил, у объекта Userstore есть свойство, пользователи, это список:

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

Когда я использую Джерси, чтобы излучать версию 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",
    }]
}

Возможно, проблема, с которой вы сталкиваетесь, просто связана с тем, что ваша собственность является коллекцией, а не списком ...

Для меня этот вопрос ответа будет обусловлен моделированием данных, и для моделирования данных вопрос «использование композитного ключа для детской модели или нет», если он использует композитный ключ, поэтому вы должны поместить родительский идентификатор в URI, если нет, а и У ребенка есть свой собственный идентификатор, который не является составным, поэтому вы можете просто использовать URL только с детьми.

Итак, это вопрос моделирования данных !!!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top