私はいくつかのフィールド上の休止状態の検証注釈付きクラス持って(例えば@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アノテーションを持つものと同じバリデーターを呼び出す必要があります。このバリデータを見つけて使用するにはどうすればよいですか?
。 'machineName'の' @NotNull'(または古い名前と新しい名前を比較するカスタムバリデータ)以外のすべてのバリデーションをデフォルトグループに入れ、残りのバリデータを 'Update'グループに入れます。 'updateMyObject'メソッドで両方のグループを使用します。 http://docs.jboss.org/hibernate/validator/5.0/reference/en-US/html/chapter-groups.html#d0e2595 –