JAX-RS是否需要数据传输对象(DTO)?

时间:2010-01-13 12:20:58

标签: java web-services dto jax-rs

如果JAX-RS应用程序的方法返回域对象,则表示(比如说JSON)将包含该对象的所有属性 - 对吗?但是如果这个对象包含不应该暴露给网络的“私人”数据呢?

外面的另一个方向是什么:如何防止私人领域被覆盖?

对此的唯一解决方案似乎是创建数据传输对象(dto)。

除非无法指定要映射的字段,否则使用“automapper”将不是解决方案。

那么,迫使JAX-RS开发人员创建DTO?还是有另一种解决方案吗?

3 个答案:

答案 0 :(得分:3)

对于实体的XML进行透明的编组和解组,使用JAXB注释对其进行注释(类可以使用JPA和JAXB注释进行注释,这样,可以提供XML表示以及保存在数据库中)。

@Entity
@XmlRootElement
public class MyEntity implements Serializable {

    @Id @GeneratedValue
    private Long id;

    ....

}

在上面的例子中,我只使用了一个JAXB注释@XmlRootElement。现在,假设您不希望序列化XML中的id属性。只需将JAXB注释@XmlTransient添加到其中:

@Entity
@XmlRootElement
public class MyEntity implements Serializable {

    @XmlTransient
    @Id @GeneratedValue
    private Long id;

    ....

}

所以,不,没有严格需要DTO(以及样板代码将它们映射到实体和从实体映射)。

答案 1 :(得分:2)

我认为最好说JAX-RS要求您使用表示

My Foo域对象不知道它是以RESTful方式使用的。它只知道Bar(另一个聚合根)以及它可以通过该Bar导航的任何实体。实际上,我还有一个不使用REST甚至HTTP的应用程序的命令行界面。

我的RESTful接口将Foo / Bar包装到通过URI链接到彼此的表示中。我想你可以打电话给这些DTO,但是如果你(就像在其他答案中所说的那样)只是用你需要编组和解组它们的域名注释你的域模型,那么我认为你正在编写一个禁止HATEOAS的角落。

当你有一个集合时,这也很明显。如果Foo-> * Bar你要以非编组形式返回所有Bar项目?为什么不只是一个URI,也许还有其他一些最小的数据, e.g。

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>

答案 2 :(得分:1)

@XmlTransient(或相应的注释)指示映射器/编组器不要在序列化输出中包含带注释的属性。