Требует ли JAX-RS объекты передачи данных (DTO)? - PullRequest
3 голосов
/ 13 января 2010

Если метод приложения JAX-RS будет возвращать объект домена, представление (скажем, JSON) будет содержать все атрибуты этого объекта - верно? Но что, если этот объект будет содержать «частные» данные, которые не должны быть доступны для Интернета?

А что насчет другого направления извне: как можно предотвратить переопределение приватных полей?

Похоже, единственным решением этой проблемы является создание объектов передачи данных (dto).

Использование " automapper " не будет решением, если вы не сможете указать, какие поля отображать.

Итак, вынуждает JAX-RS разработчика создавать DTO? Или есть другое решение?

Ответы [ 3 ]

3 голосов
/ 13 января 2010

Для прозрачного маршалинга и демаршаллинга в и из XML вашей сущности аннотируйте его аннотациями JAXB (класс можно аннотировать и аннотациями JPA и JAXB и, таким образом, давать представление XML, а также сохранять в базе данных ).

@Entity
@XmlRootElement
public class MyEntity implements Serializable {

    @Id @GeneratedValue
    private Long id;

    ....

}

В приведенном выше примере я использую только одну аннотацию JAXB @XmlRootElement. Теперь предположим, что вам не нужно свойство id в сериализованном XML. Просто добавьте к нему аннотацию JAXB @XmlTransient:

@Entity
@XmlRootElement
public class MyEntity implements Serializable {

    @XmlTransient
    @Id @GeneratedValue
    private Long id;

    ....

}

Итак, нет, строгой необходимости в DTO (и шаблонном коде для их сопоставления с сущностями) нет.

2 голосов
/ 25 августа 2011

Я думаю, что лучше сказать, что JAX-RS требует, чтобы вы использовали представления .

Мой объект домена Foo не подозревает, что он используется в режиме RESTful. Он знает только Bar (еще один агрегатный корень) и все сущности, по которым он может перемещаться через этот Bar. На самом деле, у меня также есть интерфейс командной строки для этого приложения, который не использует REST или даже HTTP.

Мой интерфейс RESTful включает Foo / Bar в представления, которые связаны друг с другом через URI. Я полагаю, вы можете назвать эти DTO, но если вы (как указано в других ответах) просто аннотируете свою модель предметной области тем, что требуется для их маршалирования и демаршалирования, то я думаю, что вы кодируете себя в углу, запрещающем HATEOAS. *

Это также очевидно, когда у вас есть коллекция. Если Foo -> * Bar, вы собираетесь вернуть все элементы бара в их неупорядоченном виде? Почему бы не просто URI и, возможно, некоторые другие минимальные данные, например,

GET FOO / FFF

<foo>
  <link rel="self" uri="uri="foo/fff" />
  <bar uri="bar/abc123">
    <status="Active" />
  </bar>
  <bar uri="bar/qqq">
    <status="Inactive" />
  </bar>
</foo>

Если клиент хочет узнать больше о данном баре, он может

GET bar / abc123

<bar>
  <link rel="self" uri="bar/abc123" />
  <foo uri="foo/fff" />
  <status>Active</status>
  <title>Some Bar</title>
  ...
</bar>
1 голос
/ 13 января 2010

@XmlTransient (или соответствующая аннотация) указывает картостроителям / маршаллерам не включать аннотированное свойство в сериализованный вывод.

...