Spring MVC填充@RequestParam Map <string,string =“”>

时间:2017-11-21 16:52:18

标签: spring spring-boot data-binding parameters populate

我的Spring MVC @Controller中有以下方法:

@RequestMapping(method = RequestMethod.GET)
public String testUrl(@RequestParam(value="test") Map<String, String> test) {   
    (...)
}

我称之为:

http://myUrl?test[A]=ABC&test[B]=DEF

然而,“test”RequestParam变量始终为null

为了填充“test”变量我该怎么做?

5 个答案:

答案 0 :(得分:3)

详情如下 https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestParam.html

如果方法参数是Map或MultiValueMap并且未指定参数名称,则使用所有请求参数名称和值填充map参数。

所以你会改变你的定义。

@RequestMapping(method = RequestMethod.GET)
public String testUrl(@RequestParam Map<String, String> parameters) 
{   
  (...)
}

如果您调用了网址http://myUrl?A=ABC&B=DEF

,则在您的参数中

你的方法

parameters.get("A");
parameters.get("B");

答案 1 :(得分:2)

Spring没有从具有相同名称的多个参数到HashMap的默认转换策略。但是,它可以轻松地将它们转换为List,array或Set。

@RequestMapping(value = "/testset", method = RequestMethod.GET)
    public String testSet(@RequestParam(value = "test") Set<String> test) {

        return "success";
    }

我和邮递员一样测试http://localhost:8080/mappings/testset?test=ABC&test=DEF

您将看到有数据集,[ABC,DEF]

答案 2 :(得分:1)

您需要从不同角度考虑您的问题。

  1. 第一部分:
问题标题中提到的

是如何将Map<String, String>设置为@RequestParam

考虑此端点:

@GetMapping(value = "/map")
public ResponseEntity getData(@RequestParam Map<String, String> allParams) {
    String str = Optional.ofNullable(allParams.get("first")).orElse(null);
    return ResponseEntity.ok(str);
}

您可以通过以下方式致电:

http://<ip>:<port>/child/map?first=data1&second=data2

然后,当您调试代码时,将获得以下值:

> allParams (size = 2)
    > first = data1
    > second = data2

,请求的URL的响应将为data1


  1. 第二部分:

如您所请求的url所示(您在其他答案的注释中也说过),则需要array才能通过url传递。

考虑此端点:

public ResponseEntity<?> getData (@RequestParam("test") Long[] testId,
                                  @RequestParam("notTest") Long notTestId)

要调用此API并传递适当的值,您需要通过以下方式传递参数:

?test=1&test=2&notTest=3

通过代码中的testtest[0]可访问所有test[1]值。


  1. 第三部分:

再次查看请求的网址参数,例如:test[B]

通常不可能将brackets(或[ ])放入url。您必须将等效的ASCII代码加上%符号。

例如[等于%5B,而]等于%5D

例如,test[0]将是test%5B0%5D

更多ASCII上的代码:https://ascii.cl/

答案 3 :(得分:0)

您可以创建一个新类,其中包含应由Spring填充的映射,然后将该类用作@RequestMapping带注释方法的参数。

在您的示例中创建一个新类

public static class Form {
   private Map<String, String> test;
   // getters and setters
}

然后,您可以在方法中使用Form作为参数。

@RequestMapping(method = RequestMethod.GET)
public String testUrl(Form form) {
  // use values from form.getTest()
}

答案 4 :(得分:0)

我遇到过类似的情况,客户端发送两组可变参数。我们将这些组称为 foobar。请求可能如下所示:

GET /search?page=2&size=10&foo[x]=aaa&foo[y]=bbb&bar[z]=ccc

我想将这些参数映射到两个不同的映射。类似的东西:

@GetMapping("/search")
public Page<...> search(Pageable pageable,
        @RequestParam(...) Map<String, String> foo,
        @RequestParam(...) Map<String, String> bar) {
    ...
}

@RequestParam 对我也不起作用。相反,我创建了一个 Model 类,其中包含两个 Map<> 类型的字段,与查询参数名称 foobar 匹配(@Datalombok.Data)。

@Data
public static class FooBar {
    Map<String, String> foo;
    Map<String, String> bar;
}

我的控制器代码已更改为:

@GetMapping("/search")
public Page<...> search(Pageable pageable, FooBar fooBar) {
    ...
}

当请求 GET /search?page=2&size=10&foo[x]=aaa&foo[y]=bbb&bar[z]=ccc 时,Spring 实例化了 Maps 并用键/值 fooBar.getFoo()/xaaa/y 和 { 填充 bbb {1}} 与 fooBar.getBar()/z