40

Spring MVC REST サービス (json) には、次のようなコントローラー メソッドがあります。

@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public List<...> myMethod(@Valid @RequestBody List<MyBean> request, BindingResult bindingResult) {

MyBean クラスに Bean 検証アノテーションがある場所。

この場合、検証は行われないようですが、他のコントローラーではうまく機能します。

リストをdto thisにカプセル化して、json入力を変更したくありません。

Bean のリストの検証がないのはなぜですか? 代替手段は何ですか?


4

10 に答える 10

13

これを行う唯一の方法は、リストをラップすることです。これは、JSON 入力を変更する必要があることも意味します

@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public List<...> myMethod(@Valid @RequestBody List<MyBean> request, BindingResult bindingResult) {

になります:

@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public List<...> myMethod(@Valid @RequestBody MyBeanList request, BindingResult bindingResult) {

また、次のものが必要です。

import javax.validation.Valid;
import java.util.List;

public class MyBeanList {

    @Valid
    List<MyBean> list;

    //getters and setters....
}

これは、リストのカスタムバリデーションでも可能であるように見えますが、まだそこまで行っていません。

@Valid アノテーションは、標準の JSR-303 Bean Validation API の一部であり、Spring 固有の構成ではありません。Spring MVC は、適切な Validator が構成されている限り、バインド後に @Valid オブジェクトを検証します。

参照 : http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html

于 2016-02-23T21:50:55.130 に答える
4

java.util.Listと の両方として機能するカスタムでリクエストをラップするエレガントな方法がありListますJavaBeanここを参照

于 2016-06-27T07:26:19.183 に答える
4

直接検証してみてください。このようなもの:

@Autowired
Validator validator;

@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public Object myMethod(@RequestBody List<Object> request, BindingResult bindingResult) {
    for (int i = 0; i < request.size(); i++) {
        Object o = request.get(i);
        BeanPropertyBindingResult errors = new BeanPropertyBindingResult(o, String.format("o[%d]", i));
        validator.validate(o, errors);
        if (errors.hasErrors())
            bindingResult.addAllErrors(errors);
    }
    if (bindingResult.hasErrors())
        ...
于 2016-02-24T21:40:55.080 に答える
2

org.springframework.validation.beanvalidation.LocalValidatorFactoryBean をメンバーとして独自のバリデーターを実装し、各項目に対してそのバリデーターを呼び出します。

public class CheckOutValidator implements Validator {


    private Validator validator;

   @Override
    public void validate(Object target, Errors errors) { 
    List request = (List) target;
    Iterator it = request.iterator()   
    while(it.hasNext()) {
    MyBean b = it.next();
    validator.validate(b, errors);

     }

     }

//setters and getters

}
于 2013-06-21T06:47:34.430 に答える
-4
@Valid @RequestBody List<MyBean> request

あなたが有効なjsonを提出する限り、私のために働きます:-

[
    {
        "property1": "value1",
        "property2": "value2"
      },
    {
        "property1": "value3",
        "property2": "value4"
        }
]
于 2019-05-14T10:41:50.770 に答える