Spring Controller:尽管 @Valid 和 @Size 未验证 RequestParam

Wol*_*359 4 validation rest spring spring-boot

我有一个简单的控制器方法:

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

当我省略“查询”参数时,正如预期的那样,我收到 400 Bad Request。

使用这些查询参数测试方法不起作用。

除了最后一个测试之外,所有测试都应该返回“400 Bad Request”。

"/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
Run Code Online (Sandbox Code Playgroud)

为什么 @Size(min=4) 注释被忽略?

Mic*_*ico 5

验证 RequestParameters 不像开箱即用的那样工作。

您可以将参数包装在一个类中

class SearchRequest {
    @Size(min=4)
    @NotNull
    private String query;
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后将您的控制器代码更改为

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

现在这是一种方法,你想要的可能可以使用类上的@Validated 注释来实现,但我对此一无所知,但它似乎在这里涵盖:https : //sdqali.in/blog /2015/12/04/validating-requestparams-and-pathvariables-in-spring-mvc/