是否可以在Spring控制器中拆分请求参数?

时间:2018-08-14 11:39:17

标签: java spring spring-mvc spring-restcontroller spring-rest

我有一个类似的请求

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(",")一样在控制器内拆分字符串,但这也不能解决上述问题。

2 个答案:

答案 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
}

还有许多定义自定义数据绑定器的方法。检查一下