2013-07-04 3 views
12

私はいくつかのフィールド上の休止状態の検証注釈付きクラス持って(例えば@NotNull@Size(min = 4, max = 50)など、など...)Springで@Validパラメータを使用して@RequestMethodメソッドで実行される同じバリデータをプログラムで呼び出す方法はありますか。

public class MyClass { 

    Long id; 

    @NotEmpty 
    @Size(min = 4, max = 50) 
    String machineName; 

    @NotEmpty 
    @Size(min = 4, max = 50) 
    String humanName; 

    // Getters, setters, etc… 
} 

私はまた、JSONのAPIとして動作するカスタムコントローラ、およびJSONデシリアライザを持っていますAPIメソッドが呼び出されたときにMyClassオブジェクトを作成します。

@RequestMapping(method = RequestMethod.POST) 
public long createMyObject(@RequestBody @Valid MyClass newObj) { 
    // Create the object in the database 
    return newObj.getId(); 
} 

と私は、私が使用することはできません、createMyObject@Validを使用することができますが、既存のオブジェクト

@RequestMapping(method = RequestMethod.PUT) 
public void updateMyObject(@RequestBody MyClass updatedObj) { 
    MyClass existingObj = // Get existing obj from DB by updatedObj.getId(); 

    // Do some secondary validation, such as making sure that a specific 
    // field remains unchanged compared to the existing instance 
    if (existingObj.getMachineName() != null && 
      !existingObj.getMachineName().equals(updatedObj.getMachineName())) { 
     throw new CannotChangeMachineNameException(); 
    } 
    else { 
     updatedObj.setMachineName(existingObj.getMachineName()); 
    } 

    // [HERE IS WHERE I WANT THE MAGIC TO HAPPEN] 

    // Save updatedObj to the database 
} 

を更新し、別の方法:私のカスタムコントローラでは、私はそのタイプの新しいオブジェクトを作成する方法を持っています私たちのAPI実装ではmachineNameが変更されないままでなければならないため、updateMyObjectにあります。machineNameを完全に除外したり、データベースに存在する値と同じ値を設定するJSONオブジェクトでAPIを呼び出すことができます。*

更新されたオブジェクトをデータベースに保存する前に、@Validアノテーションを持つものと同じバリデーターを呼び出す必要があります。このバリデータを見つけて使用するにはどうすればよいですか?

+1

。 'machineName'の' @NotNull'(または古い名前と新しい名前を比較するカスタムバリデータ)以外のすべてのバリデーションをデフォルトグループに入れ、残りのバリデータを 'Update'グループに入れます。 'updateMyObject'メソッドで両方のグループを使用します。 http://docs.jboss.org/hibernate/validator/5.0/reference/en-US/html/chapter-groups.html#d0e2595 –

答えて

6

コントローラメソッドで@Validを使用する必要はありません。 @Validとしてアノテーションを付けたパラメータを受け入れるバリデーションメソッドを作って、同じパラメータを返すだけでいいのです。このよう

public Book validateBook(@Valid Book book) { 
    return book; 
} 

は、Hibernateの検証パッケージを用いることであろう代替のように見えます。 Here's it's documentation

は基本的に、あなたはValidationFactoryからValidatorを取得し、このようにバリデータを使用:私はあなたが検証グループを使用することができると思う

@Test 
    public void manufacturerIsNull() { 
     Car car = new Car(null, "DD-AB-123", 4); 

     Set<ConstraintViolation<Car>> constraintViolations = 
      validator.validate(car); 

     assertEquals(1, constraintViolations.size()); 
     assertEquals("may not be null", constraintViolations.iterator().next().getMessage()); 
} 
+1

ありがとう!最初のメソッドがうまくいかず、2番目のメソッドに似たようなことが起こりました。Set > errors = Validation.buildDefaultValidatorFactory()。getValidator()。validate(updatedObj); //あなたが指摘したドキュメントからこれを得ました – daniel

関連する問題