2016-06-13 10 views
4

私は更新/追加の両方にBeanを使用する必要があります。今私は名前が一意でなければならないとして検証を持っています。Spring JSR 303検証アクセス中のその他のフィールド値

追加中に、DBをクエリすることによって一意の値をチェックするので、検証部分が正しく機能しています。

私は同じレコードを更新したいとき、DB内のユニーク制約をチェックしようとしており、レコードが既に存在するので失敗します。

ロール豆

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; 
    } 
} 

マイカスタム注釈バリ私はスクリーンロール名が検証されてからのみRoleDescフィールドを更新して検証エラーがスローされます今

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; 
    } 

} 

同じロール名がDBに存在します。私は、次の更新画面が前の値から変更された場合にのみフィールドを検証するということを言って、画面からカスタムバリデーターに他の変数を送ることができる方法はありますか?

答えて

0

I:

次に、あなたがこのようなものにするために(おそらく検証が起こっている方法を包む別の注釈によって提供される)コンテキスト情報を使用するために豆の検証を呼び出して、あなたのインターセプタを更新する必要がありますすべての必須フィールドがそのメソッドを通じて単一のマップとして返​​され、validationIMPLですべての必要な情報が取得され、それに応じて処理されるgetterメソッドで注釈を付けることで、回避策が提供されました。

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です。あなたはまた、CreationGroupインターフェイスを作成する必要があります

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

:あなたは、あなたに注釈を変更します。

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

しかし、値が変更された場合にのみ、検証情報を渡します。編集/追加でも検証する必要があるので、値が変更された場合にのみ検証する必要があります – Pathfinder

+0

他のフィールド値(maskRoleName)を現在のフィールドと一緒に渡す方法はありますか? masroleName = roleNameに続いて検証がないことを確認してください – Pathfinder

+0

名前が変更されたかどうかを確認するために更新する際に、エンティティをルックアップするために使用できる主キーがあると思われます。これはあなたのRoleオブジェクトと一緒に渡したい情報です。ただし、この特定の問題については、代わりにデータベース列に一意の制約を追加し、違反が発生した場合には必ずその障害を引き起こすようにします。 – Chill

関連する問題