控制器中有一个方法可以处理 GET 请求。此方法用 注释@GetMapping(params = {ParameterName.SORT_BY, ParameterName.SORT_TYPE})。参数中的这个方法在注释的帮助下将@RequestParam来自 GET 请求的参数绑定到 String 类型的 Java 变量。它看起来像这样:
@GetMapping(params = {ParameterName.SORT_BY, ParameterName.SORT_TYPE})
public List<GiftCertificate> findAllAndSort(@RequestParam(value = ParameterName.SORT_BY) String sortBy,
@RequestParam(value = ParameterName.SORT_TYPE, required = false) String sortType) {
log.info("Sorting: {}, {}", sortBy, sortType);
return service.findAllAndSort(sortType, sortBy);
}
参数sortType有一个required = false,这意味着给定的参数不必是: @RequestParam(value = ParameterName.SORT_TYPE, required = false) String sortType)。
消息来源说:
映射请求的参数,缩小主映射。适用于任何环境的相同格式:一系列“myParam=myValue”样式表达式,仅在发现每个此类参数具有给定值时才映射请求。表达式可以通过使用“!=”运算符来否定,如“myParam!= myValue”。还支持“myParam”样式表达式,此类参数必须存在于请求中(允许具有任何值)。最后,“!myParam”样式表达式表明指定的参数不应该出现在请求中。在类型级别和方法级别都支持!在类型级别使用时,所有方法级别映射都继承此参数限制。
这意味着@GetMapping(params = {...})在请求中指定的所有参数都必须存在。那为什么要在里面做flagrequired呢@RequestParam?
那么问题是为什么在请求视图时:
http://localhost:8080/gift-certificates?sort_by=name&sort_type=DESC
请求属于这种方法。http://localhost:8080/gift-certificates?sort_by=name
不包括在这个方法中。
更新
@roman-konoval 如果注释在不同阶段起作用,为什么这不起作用?
@GetMapping
public List<GiftCertificate> findAllAndSort(@RequestParam(value = ParameterName.SORT_BY) String sortBy,
@RequestParam(value = ParameterName.SORT_TYPE, required = false) String sortType) {
log.info("Sorting: {}, {}", sortBy, sortType);
return service.findAllAndSort(sortType, sortBy);
}
```
我将描述实验的过程,以便对其他人更有用。
起初,我尝试进行如下查询:
[``]但不支持方括号,因为有效的 GET 请求字符在 RFC 7230 和 RFC 3986 中定义。结果,我决定采用两种方法并将论点替换
String ... sortBy为Set<String> sortBy. 现在 GET 请求如下所示:但是,在一种方法的帮助下组织这种情况的问题仍然悬而未决。