【问题标题】:Are DTO's necessary when sending JSON from a RESTful web service?从 RESTful Web 服务发送 JSON 时是否需要 DTO?
【发布时间】:2016-12-08 12:10:56
【问题描述】:

我正在尝试使用 Spring MVC 构建一个 RESTful Web 服务。我正在使用 Jackson 的 fasterxml JSON 解析器进行客户端和服务器端之间的通信。

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

那么,在使用 JSON 进行客户端和服务器之间的通信时,在从响应正文中省略敏感字段时是否需要 DTO,或者注释 @JsonIgnore@JsonProperty 是否足以防止敏感数据泄露?

【问题讨论】:

    标签: java json spring rest jackson


    【解决方案1】:

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

    将 REST API 与域隔离并将较低级别的域实体映射到服务级别的 DTO 是明智的,最常见的是使用 POJO 映射器。

    这会对性能产生一些影响,您可以对其进行优化,但有利于层之间的结构隔离。

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

    如果我们再次谈论实体,那么在持久层中添加 REST api 属性是错误的。

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

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

    【讨论】:

    • 鉴于我正在使用 Jackson 的 @JsonIgnore,使用 DTO 的目的是什么?例如,假设我有一个带有idusernamepasswordUser 对象。我将@JsonIgnore 添加到密码字段,这样当用户登录时,我只返回idusername,因为当对象被序列化时password 字段被忽略。这种方法是否存在任何安全漏洞?在给定的示例中,我是否需要 DTO?
    • 这会起作用,但在架构上它不是首选。稍后您将需要创建复杂的 API,如果坚持公开实体,您将混合实体和瞬态 DTO,并且您的代码库将被污染。
    • 所以本质上,对于每个新的信息请求,我需要一个 DTO,其中包含与映射实体中的字段相同的字段子集?例如,如果我创建一个用于注册的表单,我需要一个 UserDTO,其中包含表单中的字段以及简单的 getter 和 setter,不多也不少?
    • @JakeMiller 如果您想在不破坏 Web API 的情况下重构 JPA 实体会发生什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多