2012-01-11 10 views
4

を検証する私はこのように言って、単純なクラスはFooを有する:スプリング3、JSR-303(豆の検証)と収集

public class Foo { 
    @NotNull 
    private String bar; 
    public String getBar(){ return bar; } 
    public void setBar(String _bar){ this.bar = _bar; } 
} 

ここで、Iは、配列(またはコレクションを取るコントローラREST方法を有します)FoosのすべてのFooがnull以外のbarプロパティを持つようにしたい。 私はトリックになるだろう@Valid注釈を使用して思ったが、そうではないようだ。

@Controller 
public class MyController { 
    @RequestMapping(value="/foos", method=RequestMethod.POST) 
    public @ResponseBody String createFoos(@Valid @RequestBody Foo[] foos){ 
     // blah blah blah 
     return "yeah"; 
    } 
} 

注:これは、いずれかの一覧<はFoo >では動作しません。しかし、ユニークなFooで動作します!

「コレクション」または「配列」内に「複数の」オブジェクトがある場合、Springの検証は機能しません。

カスタム注釈付きのHandlerMethodArgumentResolverを実装しようとしましたが、BindingResultで "インデックス付きのプロパティ名"を定義する方法がわかりません。

誰かがこの問題の回避策を知っていると、非常に感謝しています! :)

答えて

0

あなたの実装であなたが欠けていると思うことがいくつかあります。あなたは、この作業を行うためにオブジェクトグラフの概念を使いたいでしょう。

あなたのクラスFooはそのフィールドの1つで@NotNull検証をしていますが、コレクションで有効である必要があるものは実際には表現していません。 Hibernateのリファレンスから

オブジェクトグラフの検証は、コレクション型指定されたフィールドのために動作します。つまり、java.lang.Iterable(特にCollection、ListおよびSet)または のjava.util.Mapを実装する配列のすべての属性は、@Validで注釈を付けられます。これにより、含まれている各要素の妥当性が検証されます。オブジェクトが検証されます。

だからあなたのコードは、私がここに@NotNull注釈に反対

@Controller 
public class MyController { 
    @RequestMapping(value="/foos", method=RequestMethod.POST) 
    public @ResponseBody String createFoos(@Valid @NotNull @RequestBody Foo[] foos){ 
     // blah blah blah 
     return "yeah"; 
    } 
} 
+0

なります。 私のfoosパラメータがNULL可能である場合はどうなりますか? Fooインスタンスが配列内にあるとすぐにbarフィールドが常に設定されるようにしたいと思います。 –

関連する問題