Spring Controller: RequestParam не проверен, несмотря на @Valid и @Size - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть простой метод Controller:

@GetMapping("/search")
    public List<Result> search(@RequestParam @Valid @NotNull @Size(min = 4) String query) {
        return searchService.search(query);
    }

Когда я опускаю параметр «query», я получаю 400 Bad Request, как и ожидалось.

Тестирование метода с этим запросомпараметры не работают.

Все, кроме последнего теста, должны возвращать «400 неверных запросов».

"/search"             --> actual 400 Bad Request, test passes
"/search?query="      --> actual 200 Ok, expected 400 because @Size(min=4)
"/search?query=a"     --> actual 200 Ok, expected 400 because @Size(min=4)
"/search?query=ab"    --> actual 200 Ok, expected 400 because @Size(min=4)
"/search?query=abc"   --> actual 200 Ok, expected 400 because @Size(min=4)
"/search?query=abcd"  --> actual 200 Ok, test passes

Почему аннотация @Size (min = 4) игнорируется?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Вы можете использовать проверку RequestParameters из коробки)

Вам необходимо добавить MethodValidationPostProcessor в вашу конфигурацию

@org.springframework.context.annotation.Configuration
public class Configuration {

    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        return new MethodValidationPostProcessor();
    }

}

И @Validated Annotation для вашего контроллера

@RestController
@Validated
public class MyController {

    @GetMapping("/search")
    public String search(@RequestParam @NotNull @Size(min = 4) String query) {
        return "success";
    }

}

Помните также, что вы можете обрабатывать исключение, которое выдается, если параметры метода недопустимы, вы можете сделать это следующим образом

@ControllerAdvice
@Component
public class ExceptionHandler {
    @ExceptionHandler
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public List handle(MethodArgumentNotValidException exception) {
        //do your stuff here
        return exception.getBindingResult().getFieldErrors()
                .stream()
                .map(FieldError::getDefaultMessage)
                .collect(Collectors.toList()));
    }


    @ExceptionHandler
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public List handle(ConstraintViolationException exception) {
       //do your staff here
    }

}
0 голосов
/ 11 декабря 2018

Проверка RequestParameters не работает, как это из коробки.

Вы можете обернуть параметры в классе, как

class SearchRequest {
    @Size(min=4)
    @NotNull
    private String query;
    ...
}

Затем изменить код контроллера на

@GetMapping("/search")
public List<Result> search(@ModelAttribute @Valid SearchRequest searchRequest) {
    return searchService.search(searchRequest.getQuery());
}

Теперь это один из способов сделать это, то, что вы хотите, вероятно, достижимо с помощью аннотации @Validated для класса, но я ничего не знаю об этом, но, кажется, что здесь рассматривается: https://sdqali.in/blog/2015/12/04/validating-requestparams-and-pathvariables-in-spring-mvc/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...