2010-01-13 57 views
3

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

从外部来看另一个方向是什么:如何防止私人领域被忽略?

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

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

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

回答

1

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

+0

谢谢你,这就是我寻找。 – deamon 2010-01-13 16:56:59

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(和样板代码将它们映射到和实体)。

+0

!真酷! – deamon 2010-01-13 16:56:17

+0

@XmlTransient是否支持每种输出格式JAX-RS支持还是仅限于XML和JSON? – deamon 2010-01-13 17:05:59

+0

@XmlTransient来自JAXB,JAXB用于XML。 JSON输出器恰好支持子集。所以它取决于用于格式问题的序列化程序。 FWIW,我不知道其他'标准'串行器,所以它可能是一个有争议的问题。 – StaxMan 2010-02-08 00:27:07

2

我认为最好说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> 
+0

当然,这只是一个开始,因为通过HATEOAS,你将提供其他的“意味着”客户可以采取行动的链接,这就是记住URIs不透明并且不必指向一个文件。例如,对于bar/abc123,您可能会将其发布到一个栏/停用URI,并将该状态设置为非活动状态。或者一个常见的停用URI - 或者其他的!含义在超文本和您定义的关系中。你*不应该被认为只是传递DTO。 – 2011-08-25 18:33:20

+1

缺点是使用这些*表示类意味着要维护的整个其他对象集。我看到有人使用Resource类本身来“表现”。也许这是更好的选择,但它看起来很混乱。到目前为止,我唯一的猜测是,我需要将更多逻辑推送到域服务和实体中,并将​​其保留在资源之外,但我避免了这种情况,因为我不希望域名知道它的存在以RESTful方式使用。 – 2011-08-25 18:33:58

相关问题