Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 设计模式-如何仅在某些情况下强制执行对象属性(生成器模式、依赖项注入)_Java_Design Patterns_Dependency Injection_Builder - Fatal编程技术网

Java 设计模式-如何仅在某些情况下强制执行对象属性(生成器模式、依赖项注入)

Java 设计模式-如何仅在某些情况下强制执行对象属性(生成器模式、依赖项注入),java,design-patterns,dependency-injection,builder,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; //

我在一个非常特殊的情况下使用我正在编写的一个类。我有一个名为
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
}
在我的代码中,有几种情况下我只需要一个类型为
User
的空对象,因此只需要使用默认构造函数构建它:
newuser()

但是,我有另一个名为
CreateUserRequest
的类,它对REST请求进行建模,以在服务器中创建用户。最小有效负载必须包含以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.");
}
这是工作正常,但有些东西很痒。。。我希望以一种更安全的方式强制执行此操作,这样代码将强制执行要填充的属性,而不会引发异常

我觉得一定有更好的方法来设计模式。我曾想过创建一个
UserRequestBuilder
类,但这也可能意味着在
build()
方法中抛出一个异常(否则,有没有办法保证在
build()
之前填充属性?)。依赖注入听起来也是一种可能性,但我不确定在这个特定的示例中我将如何将其放置到位


有什么想法吗?

让您的REST服务在用户身上运行怎么样?(当然,UserDTO可以替换为User的子类)

您可以使用@NonNull注释UserDTO上的字段、setter或构造函数参数,并在向UserDTO传递null值而不是名称、密码、电子邮件等时发出编译器警告

使用类似的框架,REST服务DTO和后端对象之间的映射非常容易:

@Mapper
public interface UserMapper {

    public static final UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);

    UserDTO map(User user);

    User map(UserDTO userDTO);
}
上面的代码在编译后将生成一个UserMapper实现,其中包含指定方法的自动生成代码(-并且自动生成的代码只是简单地将类似命名的getter和setter配对。您可以自己完成这项工作,但对于许多DTO/实体来说,这将变得非常耗时和无聊)

在DTO中,可以排除所有不想公开的字段

我自己对上面提到的用法是:我正在基于Jersey创建一个REST服务器,即JAX-RS的参考实现。这个项目称为a,只知道DTO。REST方法调用另一个项目B,该项目B从数据库检索对象,并将它们映射到相应的DTO,然后再返回到项目A。这种模式的部分原因是,由于历史原因,项目B的实体中充斥着方法/功能,对于健全性检查(JSON到DTO),jersey支持Bean验证,也就是说,如果每个rest资源的输入Bean都用@Valid注释,那么框架将验证它们。 还可以创建自己的自定义注释,其中定义了ConstraintValidator。bean验证框架将检查带注释的jersey REST方法参数上的这些约束。
请参见

我遇到了一个类似的问题,我提出了一个解决方案,即添加一个带有参数的构造函数的Custombuilder。因此,它确保我正在确保客户机(用户)必须为构建该对象提供这些凭据

    class UserRequestBuilder{
          public UserRequestBuilder(String name,String password,String email,String authenticationRealm){
// set values here
}
}

听起来像是另一个对象,一个CreateUser对象,可能有一个构造函数并验证提供的值。因为它们执行两个不同的任务,所以它们必须基于同一个类吗?我现在的想法是在User类上添加一个新的isValidUserRequest()方法。认为用户类应该自己决定它在请求中是否有效。谢谢@dbugger的评论。是-几个REST调用生成或使用与
用户
类具有相同属性的JSON对象(即,用户类表示远程实体)。这些类实际上并没有执行不同的任务。
CreateUserRequest
类生成一个REST调用,该调用以JSON格式在有效负载中传递一个
User
对象。@LawrenceTierney感谢您的评论。这是有道理的。但是,我会遇到同样的问题-如果
isValidUserRequest()
返回false怎么办?我仍然需要设法治疗它。理想情况下,我希望只有在所有属性都存在的情况下才能创建(或构建)用户请求。它们可以实现相同的抽象,IUser或UserBase,因此它们外表相似,但内部有不同的优点。非常有趣的方法,@Hervian。我会尝试一下,如果它有效的话,我会把它标记为答案。谢谢。我采用了一种非常相似的方法,效果很好。谢谢