java - 我们能否保护域模型免受 JSON 请求的影响而不创建 DTO 对象?

标签 java json spring hibernate spring-data

对于 Web/JSON 请求,我们不想向客户端公开整个域模型。本例中的模式之一是使用 DTO 对象,然后在域模型和 DTO 之间进行映射。

DTO 的示例是在 JSON 请求中使用的 LoginUserDTO:

public class LoginUserDTO {
    private String email;
    private String password;
}

此外,我们还有一个 User POJO,被注释为具有更多属性的实体。通过使用 LoginUserDTO,我们可以保护要更新的用户实体的其他字段

但是,拥有多个 DTO 会导致代码重复,是否可以避免这种重复?我正在使用 Spring/Hibernate 和 Spring Data

最佳答案

这肯定是更多的代码,但最终是值得的。如果您的服务应该“拥有”其数据,则应该将其从最终用户中抽象出来。这意味着为客户提供 API。 API 具有 DTO 和函数。数据层有自己的模型。

试想一下,如果您想开始将数据存储为时间序列。您不希望所有客户都知道这一点。或者您想在表中添加或删除字段。或者您想编写一个奇特的联接来减少查询次数。如果您没有两组对象,所有这些都意味着更改您面向用户的 API。

因此,除了 DTO 和模型之外,您还需要一个转换器!幸运的是,Spring 已准备好使用模式/类。

import com.example.dto.LoginUserDto;
import com.example.model.LoginUser;
import org.springframework.core.convert.converter.Converter;

public class LoginUserDtoToLoginUserConverter
    implements Converter <LoginUserDto, LoginUser> {

  @Override
  public LoginUser convert(LoginUserDto source) {
    if (source == null) {
      return null;
    }
    LoginUser target = new LoginUser();
    target.setEmail(source.getEmail());
    target.setPassword(source.getPassword());
    return target;
  }
}

乐趣还没有结束!将对象返回给客户端时,您仍然需要将模型对象转换回为 DTO。耶!

import com.example.dto.LoginUserDto;
import com.example.model.LoginUser;
import org.springframework.core.convert.converter.Converter;

public class LoginUserToLoginUserDtoConverter
    implements Converter <LoginUser, LoginUserDto> {

  @Override
  public LoginUserDto convert(LoginUser source) {
    if (source == null) {
      return null;
    }
    LoginUserDto target = new LoginUserDto();
    target.setEmail(source.getEmail());
    target.setPassword(source.getPassword());
    return target;
  }
}

漂亮不是吗。这么多浪费。但不,确实没有其他办法可以解决这个问题。您可以存储“wire”对象,也可以转换它们。

祝你好运。

关于java - 我们能否保护域模型免受 JSON 请求的影响而不创建 DTO 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42844829/

相关文章:

json - Go:JSON 编码嵌套结构;错误地省略了外部字段

c# - 异构json数据反序列化失败

java - Spring 应用程序正在从我的所有属性文件加载属性,而不仅仅是我在上下文 :property-placeholder 中指定的属性

java - Google App Engine (Java) + Spring 管理的 PersistenceManager

java小程序(绘制快乐或笑脸)

java - URL 重写期间链接 URL(带有 JSessionID)被截断

c# - 尝试 C# 将 Json 解析为带有内部数组的字典

java - 事务中hibernate删除实体后仍然可以选择

java - 使用 JSF 2.0 和 EJB 3 的 MVC 架构示例?

java - 应用程序在设备/模拟器中运行时崩溃