我有一个要求,其中我想使用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中存在相同的角色名称而引发验证错误。有没有办法我可以从屏幕上将其他变量发送到我的自定义验证器,说明以下是更新屏幕,所以只有在它从之前的值更改时才验证该字段?
答案 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);
}