Spring ModelAttribute 正确解析
Spring ModelAttribute correct parsing
我有 Spring 控制器,端点如下:
@RequestMapping("/provider")
public ResponseEntity<Something> load(@ModelAttribute PageRequest pageRequest)
{
... //do something
}
其中 PageRequest
是简单的 POJO:
class PageRequest
{
String[] field;
String[] value;
... // constructor getters settest
}
当我收到这样的请求时:
.../provider?field=commanders&value=John%2CBill%2CAlex
然后 pageRequest
映射数据:
field[0] = commanders;
value[0] = John
value[1] = Bill
value[2] = Alex
但是当我收到这样的请求时:
.../provider?field=country&value=Australia&field=commanders&value=John%2CBill%2CAlex
然后 pageRequest
映射数据:
field[0] = country;
field[1] = commanders;
value[0] = Australia
value[1] = "John,Bill,Alex"
我的问题是为什么这些请求的映射不同,第一个请求和第二个请求是否可以相同。 (逗号 %2C
将数据映射到单个值)。
used: Spring 3.x
我做了一些调查,发现对于第一个请求 value=John%2CBill%2CAlex
Spring 使用 org.springframework.format.supportDefaultFormattingConversionService
class 其底层有 org.springframework.core.convert.support.StringToArrayConverter
其 convert()
方法使用逗号作为分隔符将字符串拆分为数组。
您有两种方法可以解决此问题:
- 使用;而不是 , 作为您值的分隔符 (
value=John;Bill;Alex
)
- 使用不同的转换服务 bean,其中包含您自己的从 String 到 String[] 的转换器。有关详细信息,请查看此 answer
我有 Spring 控制器,端点如下:
@RequestMapping("/provider")
public ResponseEntity<Something> load(@ModelAttribute PageRequest pageRequest)
{
... //do something
}
其中 PageRequest
是简单的 POJO:
class PageRequest
{
String[] field;
String[] value;
... // constructor getters settest
}
当我收到这样的请求时:
.../provider?field=commanders&value=John%2CBill%2CAlex
然后 pageRequest
映射数据:
field[0] = commanders;
value[0] = John
value[1] = Bill
value[2] = Alex
但是当我收到这样的请求时:
.../provider?field=country&value=Australia&field=commanders&value=John%2CBill%2CAlex
然后 pageRequest
映射数据:
field[0] = country;
field[1] = commanders;
value[0] = Australia
value[1] = "John,Bill,Alex"
我的问题是为什么这些请求的映射不同,第一个请求和第二个请求是否可以相同。 (逗号 %2C
将数据映射到单个值)。
used: Spring 3.x
我做了一些调查,发现对于第一个请求 value=John%2CBill%2CAlex
Spring 使用 org.springframework.format.supportDefaultFormattingConversionService
class 其底层有 org.springframework.core.convert.support.StringToArrayConverter
其 convert()
方法使用逗号作为分隔符将字符串拆分为数组。
您有两种方法可以解决此问题:
- 使用;而不是 , 作为您值的分隔符 (
value=John;Bill;Alex
) - 使用不同的转换服务 bean,其中包含您自己的从 String 到 String[] 的转换器。有关详细信息,请查看此 answer