对于 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/