编辑/添加

时间:2016-06-13 17:14:14

标签: java validation spring-mvc

我有一个要求,其中我想使用Bean进行更新/添加。现在我有一个验证,因为名称应该是唯一的。

现在在添加期间,验证部分正常工作,因为它通过查询DB来检查唯一值。

现在,当我想更新同一条记录时,它正在尝试检查数据库中的唯一约束,并因记录已存在而失败。

角色Bean

public class Role {
    @NotEmpty
    @Pattern(regexp = "[a-zA-Z ]*")
    @UniqueValue(query = AppConstants.UNIQUE_VALIDATION_DB_QUERY)
    private String roleName;
    private String roleDesc;
    private boolean active;
 private String maskRoleName;

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public String getRoleDesc() {
        return roleDesc;
    }

    public void setRoleDesc(String roleDesc) {
        this.roleDesc = roleDesc;
    }

    public boolean isActive() {
        return active;
    }

    public void setActive(boolean active) {
        this.active = active;
    }
}

我的自定义注释验证器

public class UniqueValueValidator implements ConstraintValidator<UniqueValue, String> {

    @Autowired
    private ValidationDAO validationDAO;

    private String query;

    public void initialize(UniqueValue uniqueValue) {
        this.query = uniqueValue.query();
    }

    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
            if (!StringUtils.isEmpty(value) && !StringUtils.isEmpty(query)) {
                return validationDAO.isValidUniqueField(query, value);
            }
        return true;
    }

}

现在,当我仅从屏幕更新RoleDesc字段时,角色名称已经过验证,并且因为DB中存在相同的角色名称而引发验证错误。有没有办法我可以从屏幕上将其他变量发送到我的自定义验证器,说明以下是更新屏幕,所以只有在它从之前的值更改时才验证该字段?

2 个答案:

答案 0 :(得分:1)

我通过在getter方法上进行注释来解决这个问题,其中所有必需的字段都通过该方法作为单个映射返回,并且在validationIMPL中我检索了所有必需的信息并进行了相应的处理。

 private String roleName;

 @UniqueValue(query = AppConstants.UNIQUE_VALIDATION_DB_QUERY)
 public Map<String,String> getUniqueValidator(){
   Map<String,String> validatorMap=new HashMap<String,String>();

   validatorMap.put("ACTION",type of action(update/new)):
   validatorMap.put("VALUE",this.roleName):
   return validatorMap;
 }

 public String getRoleName() {
        return roleName;
 }

 public void setRoleName(String roleName) {
        this.roleName = roleName;
 }

答案 1 :(得分:0)

您可能正在寻找的是Groups。您可以将注释修改为:

@UniqueValue(query = AppConstants.UNIQUE_VALIDATION_DB_QUERY, groups = {CreationGroup.class})

您还需要创建一个CreationGroup界面。

然后,您将需要更新调用bean验证的拦截器以使用上下文信息(可能由另一个包含发生验证的方法的注释提供),如下所示:

if (myMethodIsCreatingANewRecord()) {
    validator.validate(address, Default.class, CreationGroup.class);
} else {
    validator.validate(address, Default.class);
}