我想用一种方法实现一个 Spring 控制器(Rest API),我可以将请求参数映射到对象属性,如下所示:
/my/api?filter.name=Dan&filter.age=45&filter.active=true
在我的控制器方法中有这样的内容:
@GetMapping
List<MyResult> findAll(FilterDTO filter, Pageable page) {
// some code here
}
对于过滤器 DTO:
@Data //lombok
public class FilterDTO {
private String name;
private Integer age;
private Boolean active;
}
但即使我这样做,最终也不会按预期工作:
List<MyResult> findAll(@RequestParam FilterDTO filter, Pageable page) {
或者这个:
List<MyResult> findAll(@RequestParam("filter") FilterDTO filter, Pageable page) {
DTO 属性始终为“null”。
我怎样才能实现我所需要的?
首先,用
@ModelAttribute
注释你的字段是正确的方法。即使不注释它,Spring 也会自动将其视为 ModelAttribute
。
继续讨论请求参数内的前缀,具有简单、无分隔名称的参数(例如
age
)会假设在 ModelAttribute
内有一个名为 age
的字段。
添加点作为分隔符,就像
filter.age
的情况一样,假设在 ModelAttribute
内部,有一个名为 filter
的字段,它引用内部具有字段 age
的对象。所以我们现在讨论嵌套对象。
正确实现此功能的一种方法是定义一个“父 DTO”
ParentDTO
,如下所示:
public class ParentDTO {
private FilterDTO filter;
// Getters and setters...
}
虽然您的
FilterDTO
与您在问题中指定的课程没有变化
确保
FilterDTO
也定义了设置器。