是否可以在 Spring 控制器中拆分请求参数?
Is it possible to split request params in Spring controllers?
我有这样的请求:
example.com/search?sort=myfield1,-myfield2,myfield3
我想拆分这些参数以在我的控制器或 List<SortParam>
中绑定 List<String>
排序,其中 SortParam
是 class,字段如下:name
(字符串)和 ask
(布尔值)。
所以最终的控制器看起来像这样:
@RequestMapping(value = "/search", method = RequestMethod.GET)
public ResponseEntity<MyResponse> search(@RequestParam List<String> sort) {
//...
}
或
@RequestMapping(value = "/search", method = RequestMethod.GET)
public ResponseEntity<MyResponse> search(@RequestParam List<SortParam> sort) {
//...
}
有办法做到吗?
更新:
标准的参数传递方式不符合我的要求。 IE。我不能使用 sort=myfield1&sort=-myfield2&sort=myfield3
。我必须使用逗号分隔的名称。
另外,我知道我可以在我的控制器中接受 @RequestParam String sort
然后在控制器内拆分字符串,如 sort.split(",")
但它也没有解决上述问题。
是的,你当然可以做到,你就快做到了。
@RequestMapping(value = "/search", method = RequestMethod.GET)
public ResponseEntity<MyResponse> participants(@RequestParam("sort") List<String> sort) {
//...
}
您现在应该可以像这样调用您的服务(如果搜索位于您的根目录,否则根据您的情况进行调整):
curl "localhost:8080/search?sort=sortField1&sort=sortField2&sort=sortField3"
希望对您有所帮助!
编辑
抱歉,我已经阅读了您的评论,现在我清楚您需要什么了。我已经为您创建了一个解决方法,这几乎是您想要的。
所以首先是一个 SortParams class:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class SortParams {
private List<SortParam> sortParamList;
public SortParams(String commaSeparatedString) {
sortParamList = Arrays.stream(commaSeparatedString.split(","))
.map(p -> SortParam.valueOf(p))
.collect(Collectors.toList());
}
public List<SortParam> getSortParamList() {
return this.sortParamList;
}
public enum SortParam {
FOO, BAR, FOOBAR;
}
}
那么你的控制器可能看起来像这样:
@RequestMapping(value = "/search", method = RequestMethod.GET)
public ResponseEntity<List<SortParams.SortParam>> search(@RequestParam("sort") SortParams sort) {
return ResponseEntity.ok(sort.getSortParamList());
}
现在您的 SortParams 对象有一个 SortParam 列表:
curl "localhost:8080/search?sort=FOO,BAR"
["FOO","BAR"]
这样的东西符合您的要求吗?
这只是一个简单的类型转换任务。 Spring定义了一个SPI(Service Provider Interface)来实现类型转换逻辑。对于您的特定问题,您可以通过实现 Converter
接口来定义类型转换逻辑。
@Component
public class StringToListConverter implements Converter<String, List<String>> {
@Override
public List<String> convert(String source) {
return Arrays.asList(source.split(","));
}
}
您也可以根据您的逻辑将您的请求参数转换为 List<SortPram>
(但我不确定您问题中的逻辑)。就是这个!现在 Spring 了解如何将您的请求参数绑定到列表。
@RequestMapping(value = "/search", method = RequestMethod.GET)
public ResponseEntity<MyResponse> participants(@RequestParam("sort") List<String> sort) {
// .. do your logic
}
还有很多方法可以定义您的自定义数据绑定器。检查这个
我有这样的请求:
example.com/search?sort=myfield1,-myfield2,myfield3
我想拆分这些参数以在我的控制器或 List<SortParam>
中绑定 List<String>
排序,其中 SortParam
是 class,字段如下:name
(字符串)和 ask
(布尔值)。
所以最终的控制器看起来像这样:
@RequestMapping(value = "/search", method = RequestMethod.GET)
public ResponseEntity<MyResponse> search(@RequestParam List<String> sort) {
//...
}
或
@RequestMapping(value = "/search", method = RequestMethod.GET)
public ResponseEntity<MyResponse> search(@RequestParam List<SortParam> sort) {
//...
}
有办法做到吗?
更新:
标准的参数传递方式不符合我的要求。 IE。我不能使用 sort=myfield1&sort=-myfield2&sort=myfield3
。我必须使用逗号分隔的名称。
另外,我知道我可以在我的控制器中接受 @RequestParam String sort
然后在控制器内拆分字符串,如 sort.split(",")
但它也没有解决上述问题。
是的,你当然可以做到,你就快做到了。
@RequestMapping(value = "/search", method = RequestMethod.GET)
public ResponseEntity<MyResponse> participants(@RequestParam("sort") List<String> sort) {
//...
}
您现在应该可以像这样调用您的服务(如果搜索位于您的根目录,否则根据您的情况进行调整):
curl "localhost:8080/search?sort=sortField1&sort=sortField2&sort=sortField3"
希望对您有所帮助!
编辑 抱歉,我已经阅读了您的评论,现在我清楚您需要什么了。我已经为您创建了一个解决方法,这几乎是您想要的。
所以首先是一个 SortParams class:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class SortParams {
private List<SortParam> sortParamList;
public SortParams(String commaSeparatedString) {
sortParamList = Arrays.stream(commaSeparatedString.split(","))
.map(p -> SortParam.valueOf(p))
.collect(Collectors.toList());
}
public List<SortParam> getSortParamList() {
return this.sortParamList;
}
public enum SortParam {
FOO, BAR, FOOBAR;
}
}
那么你的控制器可能看起来像这样:
@RequestMapping(value = "/search", method = RequestMethod.GET)
public ResponseEntity<List<SortParams.SortParam>> search(@RequestParam("sort") SortParams sort) {
return ResponseEntity.ok(sort.getSortParamList());
}
现在您的 SortParams 对象有一个 SortParam 列表:
curl "localhost:8080/search?sort=FOO,BAR"
["FOO","BAR"]
这样的东西符合您的要求吗?
这只是一个简单的类型转换任务。 Spring定义了一个SPI(Service Provider Interface)来实现类型转换逻辑。对于您的特定问题,您可以通过实现 Converter
接口来定义类型转换逻辑。
@Component
public class StringToListConverter implements Converter<String, List<String>> {
@Override
public List<String> convert(String source) {
return Arrays.asList(source.split(","));
}
}
您也可以根据您的逻辑将您的请求参数转换为 List<SortPram>
(但我不确定您问题中的逻辑)。就是这个!现在 Spring 了解如何将您的请求参数绑定到列表。
@RequestMapping(value = "/search", method = RequestMethod.GET)
public ResponseEntity<MyResponse> participants(@RequestParam("sort") List<String> sort) {
// .. do your logic
}
还有很多方法可以定义您的自定义数据绑定器。检查这个