使用 Spring 控制器的参数名称“点”属性名称将请求参数映射到不同的 POJO / DTO

问题描述 投票:0回答:1

我想用一种方法实现一个 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”。

我怎样才能实现我所需要的?

java spring api http web
1个回答
0
投票

首先,用

@ModelAttribute
注释你的字段是正确的方法。即使不注释它,Spring 也会自动将其视为
ModelAttribute

继续讨论请求参数内的前缀,具有简单、无分隔名称的参数(例如

age
)会假设在
ModelAttribute
内有一个名为
age
的字段。

添加点作为分隔符,就像

filter.age
的情况一样,假设在
ModelAttribute
内部,有一个名为
filter
的字段,它引用内部具有字段
age
的对象。所以我们现在讨论嵌套对象。

正确实现此功能的一种方法是定义一个“父 DTO”

ParentDTO
,如下所示:

public class ParentDTO {
    private FilterDTO filter;

    // Getters and setters...
}

虽然您的

FilterDTO
与您在问题中指定的课程没有变化

确保

FilterDTO
也定义了设置器。

© www.soinside.com 2019 - 2024. All rights reserved.