Phi*_*hil 7 java design-patterns dependency-injection builder
我正处于一个非常特殊的情况,我正在编写一个类.我有这个类User看起来像这样:
public class User {
private long id; // + getters and setters
private boolean isDeletable; // + getters and setters
private String name; // + getters and setters
private String password; // + getters and setters
private String email; // + getters and setters
private String authenticationRealm; // + getters and setters
private String displayName; // + getters and setters
private Date deletedDate; // + getters and setters
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中有几种情况我只需要一个类型的空对象,User因此只需使用默认构造函数构建它:new User().
但是,我有一个名为CreateUserRequestREST的请求类,用于在服务器中创建用户.在最低有效载荷必须包含name,password,email和authenticationRealm以JSON格式发送属性.
现在我通过在请求的构造函数中检查这些参数来处理这个问题:
public CreateUserRequest(User user) {
if(user.getName() == null || user.getPassword() == null || user.getEmail() == null || user.getAuthenticationRealm() == null)
throw new RuntimeException("Not enough attributes in User object. Minimum: name, password, e-mail and authentication realm.");
}
Run Code Online (Sandbox Code Playgroud)
这工作正常但有些东西很痒......我想以更安全的方式强制执行此操作,以便代码强制执行要填充的属性,不会抛出异常.
我觉得必须有更好的方法来设计模式.我想创建一个UserRequestBuilder类,但这也可能意味着在build()方法中抛出异常(否则,有没有办法可以保证以前填充属性build()?).依赖注入也听起来像是一种可能性,但我不确定如何在这个特定的例子中使用它...
有什么想法吗?
如何让您的REST服务在用户DTO上运行?(当然,UserDTO可以替换为User的子类).
您可以使用@NonNull在UserDTO上注释字段,设置器或构造函数参数,并在将空值而不是名称密码,电子邮件等传递给UserDTO时让Checker Framework发出编译器警告.
使用像Mapstruct这样的框架,REST服务DTO和后端对象之间的映射非常简单:
@Mapper
public interface UserMapper {
public static final UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
UserDTO map(User user);
User map(UserDTO userDTO);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码将在编译时生成一个UserMapper实现,使用指定方法的自动生成代码( - 并且自动生成的代码简单地配对类似名称的getter和setter.您可以自己执行此操作,但是使用许多DTO /实体会变得耗时且无聊) .
在DTO中,您可以排除您不想公开的所有字段.
PS.我自己对上面提到的用法是:我正在创建一个基于Jersey的REST服务器,即JAX-RS的参考实现.这个项目称之为A,只知道DTO.REST方法调用另一个项目B,它从数据库中检索对象,并将它们映射到相应的DTO,然后返回到项目A.这种模式的部分原因是由于历史原因,项目B的实体是混乱的方法/功能,不应暴露给项目A.至于健全性检查(JSON到DTO),jersey支持Bean Validation,也就是说,框架将验证每个rest资源的输入bean(如果它们被注释)与@Valid.也可以创建自己的自定义注释,并定义ConstraintValidator.bean验证框架将检查带注释的jersey REST方法参数的这些约束.请参阅https://jersey.java.net/documentation/latest/bean-validation.html#d0e13690