Java 在Spring3Web应用程序中通过验证从表单命令转换为存储实体

Java 在Spring3Web应用程序中通过验证从表单命令转换为存储实体,java,spring,validation,Java,Spring,Validation,我有一个表单来创建用户和相应的命令对象。看起来是这样的: public class CreateUserForm { private String name; private String email; private String password1; private String password2; private Boolean enabled = true; ... getters and setters ... } @Entity

我有一个表单来创建用户和相应的命令对象。看起来是这样的:

public class CreateUserForm {
    private String name;
    private String email;
    private String password1;
    private String password2;
    private Boolean enabled = true;

    ... getters and setters ...
}
@Entity
public class SiteUser {
    @Id
    private String id;

    @NotEmpty
    private String name;

    @NotEmpty
    @Email
    private String email;

    @NotEmpty
    @Pattern(regexp="^[a-zA-Z0-9_]{6,20}$")
    private String password;

    @NotEmpty
    private Boolean enabled;

    ... getters and setters ...
}
我有一个基于表单输入创建和存储的用户实体对象。实体已注释验证规则,如下所示:

public class CreateUserForm {
    private String name;
    private String email;
    private String password1;
    private String password2;
    private Boolean enabled = true;

    ... getters and setters ...
}
@Entity
public class SiteUser {
    @Id
    private String id;

    @NotEmpty
    private String name;

    @NotEmpty
    @Email
    private String email;

    @NotEmpty
    @Pattern(regexp="^[a-zA-Z0-9_]{6,20}$")
    private String password;

    @NotEmpty
    private Boolean enabled;

    ... getters and setters ...
}
表单输入基本上应该具有相同的验证规则,除了表单输入需要检查password1和password2字段是否相同

我的第一个想法是向表单对象添加相同的验证注释,并创建一个自定义验证器来检查password1和password2字段是否相同。然而,我觉得在两个如此相似的对象上使用相同的验证规则是不对的


因此,我正在寻找有关如何整合基于表单输入的实体验证和存储过程的建议。

为什么不在UI中使用域对象,即SiteUser?因此,您不必复制逻辑。

您可以这样做:

public class CreateUserForm { 
    @Valid
    private SiteUser user;
    private String confirmPassword;
    ...
}
@RequestMapping(...)
public String createUser(@Valid CreateUserForm form, BindingResult result) {
    if (!form.getConfirmPassword().equals(form.getUser().getPassword())) {
        result.rejectValue("confirmPassword", ...);
    }
    ...
}
并手动检查confirmPassword.equalsuser.getPassword

更新:

手动验证如下所示:

public class CreateUserForm { 
    @Valid
    private SiteUser user;
    private String confirmPassword;
    ...
}
@RequestMapping(...)
public String createUser(@Valid CreateUserForm form, BindingResult result) {
    if (!form.getConfirmPassword().equals(form.getUser().getPassword())) {
        result.rejectValue("confirmPassword", ...);
    }
    ...
}

您还可以实现一个自定义JSR-303约束来验证密码确认以及其他字段,但我认为在这种情况下这太过分了。

Ahh…这是有道理的。因此,我想我会将password2添加到域对象中,并对其进行注释,使其不会存储在数据库中。我将在何处执行两个密码的验证,以便在绑定结果中注册错误?尝试了此操作,但SiteUser对象中的注释约束无法识别不确定我第一次做错了什么,但我现在已经开始工作了。我喜欢这种方法。谢谢你的提示。