如果JAX-RS应用程序的方法返回一个域对象,则表示(比如JSON)将包含此对象的所有属性 - 对吗?但是如果这个对象会包含“私人”数据,那么这个数据不应该暴露给网络呢?JAX-RS是否需要数据传输对象(DTO)?
从外部来看另一个方向是什么:如何防止私人领域被忽略?
唯一的解决方案似乎是创建数据传输对象(dto)。
要使用“automapper”将不是解决方案,除非无法指定要映射的字段。
那么,强制JAX-RS开发人员创建DTO?还是有另一种解决方案?
如果JAX-RS应用程序的方法返回一个域对象,则表示(比如JSON)将包含此对象的所有属性 - 对吗?但是如果这个对象会包含“私人”数据,那么这个数据不应该暴露给网络呢?JAX-RS是否需要数据传输对象(DTO)?
从外部来看另一个方向是什么:如何防止私人领域被忽略?
唯一的解决方案似乎是创建数据传输对象(dto)。
要使用“automapper”将不是解决方案,除非无法指定要映射的字段。
那么,强制JAX-RS开发人员创建DTO?还是有另一种解决方案?
@XmlTransient
(或相应的注解)指示映射器/ marshallers不要在序列化输出中包含注释的属性。
对于实体的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(和样板代码将它们映射到和实体)。
我认为最好说JAX-RS要求您使用表示。
我的Foo域对象不知道它是以REST方式使用的。它只知道Bar(另一个聚合根)以及它可以通过该Bar导航的任何实体。实际上,我也有一个不使用REST甚至HTTP的应用程序的命令行界面。
我的RESTful接口将Foo/Bar包装到通过URI链接到对方的表示中。我想你可以调用这些DTO,但是如果你(如其他答案中所述)只是注释你的域模型并编组和解组,那么我认为你将自己编码到禁止HATEOAS的角落。
当你有一个集合时,这也很明显。如果Foo - > * Bar是否要返回所有的解组形式的酒吧项目?为什么不只是一个URI和可能的一些其他最小的数据,例如
GET富/ 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酒吧/ ABC123
<bar>
<link rel="self" uri="bar/abc123" />
<foo uri="foo/fff" />
<status>Active</status>
<title>Some Bar</title>
...
</bar>
当然,这只是一个开始,因为通过HATEOAS,你将提供其他的“意味着”客户可以采取行动的链接,这就是记住URIs不透明并且不必指向一个文件。例如,对于bar/abc123,您可能会将其发布到一个栏/停用URI,并将该状态设置为非活动状态。或者一个常见的停用URI - 或者其他的!含义在超文本和您定义的关系中。你*不应该被认为只是传递DTO。 – 2011-08-25 18:33:20
缺点是使用这些*表示类意味着要维护的整个其他对象集。我看到有人使用Resource类本身来“表现”。也许这是更好的选择,但它看起来很混乱。到目前为止,我唯一的猜测是,我需要将更多逻辑推送到域服务和实体中,并将其保留在资源之外,但我避免了这种情况,因为我不希望域名知道它的存在以RESTful方式使用。 – 2011-08-25 18:33:58
谢谢你,这就是我寻找。 – deamon 2010-01-13 16:56:59