我的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”变量我该怎么做?
答案 0 :(得分:3)
如果方法参数是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)
您需要从不同角度考虑您的问题。
是如何将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
。
如您所请求的url所示(您在其他答案的注释中也说过),则需要array
才能通过url传递。
考虑此端点:
public ResponseEntity<?> getData (@RequestParam("test") Long[] testId,
@RequestParam("notTest") Long notTestId)
要调用此API并传递适当的值,您需要通过以下方式传递参数:
?test=1&test=2¬Test=3
通过代码中的test
或test[0]
可访问所有test[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)
我遇到过类似的情况,客户端发送两组可变参数。我们将这些组称为 foo
和 bar
。请求可能如下所示:
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<>
类型的字段,与查询参数名称 foo
和 bar
匹配(@Data
是 lombok.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()
/x
和 aaa
/y
和 { 填充 bbb
{1}} 与 fooBar.getBar()
/z
。