2016-06-15 4 views
0

以下のコードで試してみましたが、春のように、ビーン検証はコントローラメソッド(@RequestMappingで注釈を付けられたもの)に対してのみ機能し、プレーンメソッドはBeanの検証をトリガーしません。Bean検証は、Springのコントローラメソッドに対してのみ機能しますか?

@RequestMapping(value = "/test-validate", method = RequestMethod.POST) 
public String test(@Validated Obj obj){ 
    return "validation-works"; 
} 

@RequestMapping(value = "/test-local-method-validate", method = RequestMethod.POST) 
public String test2(@Validated Obj obj){ 
    Obj obj = new Obj(); 
    localValidate(obj);//won't validate, though content is null 
} 

void localValidate(@Validated Obj obj){ 
    log.debug("entered"); 
} 

//Model 
public class Obj{ 
    @NotNull 
    public String content = null; 
} 

我々は最初のメソッドを呼び出す場合:/テストローカルメソッド検証、我々はローカル普通の方法で呼び出す:/テスト検証第二の方法のためながら、検証は、トリガーするlocalValidate、検証は機能しません。

trueの場合、どのようにプレーンメソッドでBean検証を有効にできますか?

+0

質問がありますか? –

+0

@MDeinum元の質問に質問を追加: プレーンな方法でBeanの検証を有効にするにはどうすればよいですか? – DiveInto

+0

AspectJを使ってAOPをトリッキーにしないと、それを有効にすることはできません。これを有効にするために 'MethodValidationPostProcessor'を登録することはできますが、(AOPプロキシの使用による)内部呼び出しではなく、外部呼び出しに対してのみ機能します。 –

答えて

1

答えは:localValidate(obj)を呼び出すときに、作成されたプロキシを完全にスキップし、このプロキシが検証部分を担当しているため、現在のコードでは機能しません。

オプション:

  1. あなたのコントローラに注入するorg.springframework.validation.Validatorを、パッケージには、スコープの保護、別のSpringコンポーネントを、このロジックを抽出し、コントローラにそれを注入し、
  2. 、あなたのlocalValidate方法の代わりに、それを呼び出すことができますし、手動で電話する
関連する問題