2016-06-13 49 views
4

我有一個要求,其中我想要使用Bean來更新/添加。現在我有一個驗證名稱應該是唯一的。Spring JSR 303驗證訪問其他字段值,同時編輯/添加

現在在添加驗證部分工作正常,因爲它通過查詢數據庫檢查唯一值。

現在,當我想更新相同的記錄時,它試圖檢查數據庫中的唯一約束,並且因爲記錄已經存在而失敗。

角色豆

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場並引發驗證錯誤的數據庫中存在相同的角色名稱。有沒有一種方法可以將其他變量發送到我的自定義驗證器從屏幕上說以下是更新屏幕,所以只有驗證該字段,如果它從以前的值更改?

回答

0

我通過在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; 
} 
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); 
} 
+0

但是,我如何通過驗證的信息只有當值被改變。因爲我需要驗證,即使在添加/編輯...但在編輯的情況下,我應該只有當值更改 – Pathfinder

+0

有效的方式來傳遞其他字段值(maskRoleName)與當前字段...以便我可以檢查masroleName = roleName,然後不驗證 – Pathfinder

+0

假設您有一個主鍵,您可以在更新時使用它來查找實體,以檢查名稱是否已更改。這是您想要與角色對象一起傳遞的信息。然而,對於這個特定的問題,我可能會添加一個唯一的約束到數據庫列,而只是讓它在違反時導致失敗。 – Chill