@ Действительно работает с @ModelAttribute, а не с @RequestAttribute - PullRequest
0 голосов
/ 21 апреля 2020

Я реализую @RestController и понял, что @Valid работает с @RequestBody или @ModelAttribute параметрами метода @GetMapping, но не с параметром @RequestAttribute.

Чтобы получить проверенный аннотированный параметр @RequestAttribute, я должен пометить свой класс Controller с помощью @Validated.

, следуя моему коду:

  1. Controller

    @Log4j2
    @RestController
    @RequestMapping("/test/api/v1/entity")
    public class MyController extends SomeController {
    
      @GetMapping("/getInfo")
      public ResponseEntity<<MyResponse>> infoStatus (RequestParam(required = false) String inputStr,
      @Valid @RequestAttribute ObjectToValidate objToValidate){
           //Any stuff here
      }
    }
    
  2. Бин для проверки

    @Getter
    @Setter
    @Valid 
    public class ObjectToValidate {
    
      @NotNull
      @NotEmpty
      private String anyCode;
    }
    

В результате anyCode не проверяется, чтобы не быть ни нулевым, ни пустым. Если я аннотирую MyController с помощью @Validate, параметр ObjectToValidate будет подтвержден, как и ожидалось. Если я поменяю контроллер следующим образом, проверка также сработает.

    @Log4j2
    @RestController
    @RequestMapping("/test/api/v1/entity")
    public class MyController extends SomeController {

        @ModelAttribute 
        public ObjectToValidate addToModel(@RequestAttribute ObjectToValidate
        objToValidate) { return objToValidate; }

        @GetMapping("/getInfo")
        public ResponseEntity<MyResponse> infoStatus (
                @RequestParam(required = false) String inputStr,
                @Valid @ModelAttribute ObjectToValidate objToValidate
        ){
           //Any stuff here
        }
   }

Пожалуйста, не могли бы вы объяснить, почему?

1 Ответ

0 голосов
/ 21 апреля 2020

@ Valid можно использовать в аргументах метода контроллера @RequestBody. То есть аргумент метода @RequestBody может быть аннотирован с помощью @ Valid для автоматического запуска c проверки .

Не будет смысла аннотировать класс ObjectToValidate с помощью @ Valid.

@PostMapping("/notes")
Note getNote(@Valid @RequestBody Note note) {
    return repository.save(note);
}

Чтобы проверить переменную пути, класс контроллера должен быть помечен @ Validated

@RestController
@Validated // class level
public class NoteController {

    @GetMapping("/note/{id}")
    Note findOne(@PathVariable @NotBlank(message = "Id must not be empty") String id) { 
        return repository.findById(id)
                .orElseThrow(() -> new NotekNotFoundException(id));
    }

}

Надеюсь, это поможет !!

...