2

メールのリストを取得し、それらのメールにメッセージを送信する単純な MVC コントローラーがあります。

json POST 本体

{"emailAddresses" : []} 

コード

@RequestMapping(value = "/{id}/share", method = RequestMethod.POST)
@ResponseBody
public void shareThing(@PathVariable(value = "id") final String id, @Valid @NotEmpty       @RequestBody  final List<String> emailAddresses)

基本的に、クライアントがメールなしでリクエストを投稿すると失敗するように、jsr-303 を使用したいと考えています。できれば401で。

上記のコードは機能しますか? または、私は何をする必要がありますか?これがセットアップです。Hibernate バリデーターはクラスパス上にあるため、ピックアップされているはずです。ただし、空の json 配列を投稿すると、空の配列リストがバインドされたパラメーターとしてメソッドに直接渡されます。

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.package.thing"})
public class WeConfiguration extends WebMvcConfigurerAdapter

json POST 本体

{"emailAddresses" : []} 

コード

@RequestMapping(value = "/{id}/share", method = RequestMethod.POST)
@ResponseBody
public void shareThing(@PathVariable(value = "id") final String id, @Valid @NotEmpty          @RequestBody  final List<String> emailAddresses, BindingResult bindingResult)
{
    System.out.println("Has Errors? " + bindingResult.hasErrors();
}

出力

エラーがありますか? 間違い

試行 3、ペイロードの変更、機能する...しかし、ラップする必要はないと思いますか?

public class EmailListDTO {

@NotEmpty
private List<String> emailAddresses;

public List<String> getEmailAddresses() {
    return emailAddresses;
}

public void setEmailAddresses(List<String> emailAddresses) {
    this.emailAddresses = emailAddresses;
}

}

 @RequestMapping(value = "/{id}/share", method = RequestMethod.POST)
@ResponseBody
public void shareThing(@PathVariable(value = "id") final String id, @Valid             @RequestBody  EmailListDTO emailListDTO, BindingResult bindingResult)
{
    System.out.println("Has Errors? " + bindingResult.hasErrors();
} 

json POST 本体

{"emailAddresses" : []} 

出力

エラーがありますか? 真実

4

1 に答える 1

5

@Validパラメータ クラス タイプ自体がjavax.validationフィールドに注釈を持っているかどうかを検証します。したがって、 を使用しValidatorてクラスをスキャンしListて検証アノテーションを探しますが、これは望ましくありません。

List<String>DTOにラップし、パラメーターをそれに変更する必要があります

public class MyListDTO {
    @NotEmpty 
    private List<String> emailAddresses;
    ... //getters and setters
}

@Valid失敗させるだけでなく、エラーをBindingResultオブジェクトにバインドします。ハンドラーメソッドにパラメーターを追加する場合BindingResult(パラメーターの隣にある必要があり@Validます)

 public void shareThing(@PathVariable(value = "id") final String id, @Valid @RequestBody final MyListDTO myDTO, BindingResult errors )

次に、エラーをチェックして、BindingResult何をすべきかを選択できます。

于 2013-10-18T20:54:06.640 に答える