2016-08-02 88 views
1

我正在尝试使用Spring MVC构建一个RESTful Web服务。我正在使用Jackson的fasterxml JSON解析器进行客户端和服务器端之间的通信。从RESTful Web服务发送JSON时,DTO是否必需?

我想确定是否将DTO(数据传输对象)实现到我的RESTful API中。我目前正在利用Jackson的@JsonProperty(access = Access.WRITE_ONLY)@JsonIgnore注释来防止敏感字段(如密码)发送到客户端。

所以,使用JSON当用于在客户端和服务器之间的通信从所述响应身体省略敏感字段时是DTO的必要的或有注释@JsonIgnore@JsonProperty足以防止敏感数据泄漏?

回答

2

假设你谈论的是将实体序列化为json而不是使用不很清晰的DTO,那么从体系结构的角度来看,DTO是正确的选择。在控制器下面最常见的是在某个域上运行的服务层,比方说持久化实体或来自排队系统的实体。

将您的REST API从您的域中分离出来并将低级别域实体映射到服务级别的DTO(通常使用POJO映射器)是很正常的。

这会产生一些性能影响,您可以优化但具有层间结构隔离的好处。

第二个好处是,你可以聚合来自较低层的信息和操纵你的REST接口为你提供最佳的服务,

如果我们再次谈论的实体是错误的加入持久层的REST API属性。

所有这一切都从概念的角度出发。 另一件应该阻止您为JPA2实体提供服务的事情是,查询返回的对象是增强型对象,因此使用映射器将再次为您提供更多控制权。

选择映射器配置有点棘手,虽然如果您在持久性/域级别映射变得冗余时暴露crud操作。 公开实体只会导致缩放问题

+0

因为我正在使用Jackson的'@ JsonIgnore',所以使用DTO的目的是什么?例如,假设我有一个'id','username'和'password'的User'对象。我将'@ JsonIgnore'添加到密码字段,这样当用户登录时,我只返回'id'和'username',因为当对象被序列化时'password'字段被忽略。这种方法有没有安全漏洞?在给定的例子中,我需要一个DTO吗? –

+0

这会起作用,但在架构上它不是首选。 稍后您将需要创建复杂的API,如果坚持暴露实体,您将混合实体和瞬态DTO,并且您的代码库将被污染。 –

+0

因此,基本上,对于每个新的信息请求,我需要一个DTO,其中包含与映射实体中的字段相同的字段的子集?例如,如果我创建了一个注册表单,那么我需要一个UserDTO,它包含表单中的字段和简单的getter和setter,不多也不少? –