我有一个类似的请求
example.com/search?sort=myfield1,-myfield2,myfield3
我想在我的控制器或List<String>
中拆分这些参数以绑定List<SortParam>
排序,其中SortParam
是具有以下字段的类: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) {
//...
}
有办法做到吗?
更新:
传递参数的标准方法不能满足我的要求。即我不能使用sort=myfield1&sort=-myfield2&sort=myfield3
。我必须使用逗号分隔的名称。
另外,我确实知道我可以在控制器中接受@RequestParam String sort
,然后像sort.split(",")
一样在控制器内拆分字符串,但这也不能解决上述问题。
答案 0 :(得分:2)
是的,您当然可以做到,您就快到了。
@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类:
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"]
这样的东西适合您的需求吗?
答案 1 :(得分:2)
这只是一个简单的Type Covertion任务。 Spring定义了一个SPI(服务提供商接口)来实现类型转换逻辑。对于您的特定问题,您可以通过实现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
}
还有许多定义自定义数据绑定器的方法。检查一下