小编典典

在Spring Boot中转换为Collection时,如何防止Spring MVC解释逗号?

spring-boot

我们基本上有与该问题相同的问题,但是对于列表,此外,我们正在寻找一种全局解决方案。

当前,我们有一个REST调用,其定义如下:

@RequestMapping
@ResponseBody
public Object listProducts(@RequestParam(value = "attributes", required = false) List<String> attributes) {

调用工作正常,并且像这样调用时,列表属性将包含两个元素“ test1:12,3”和“ test1:test2”:

product/list?attributes=test1:12,3&attributes=test1:test2

但是,当按如下方式调用时,列表属性还将包含两个元素“ test1:12”和“ 3”:

product/list?attributes=test1:12,3

这样做的原因是,在第一种情况下,Spring将在第一种情况下使用ArrayToCollectionConverter。在第二种情况下,它将使用StringToCollectionConverter,它将使用“,”作为分隔符拆分参数。

如何配置Spring Boot以忽略参数中的逗号?如果可能,解决方案应该是全局的。

我们尝试了什么:

这个问题对我们不起作用,因为我们有一个List而不是一个数组。此外,这仅是控制器本地解决方案。

我也尝试添加此配置:

@Bean(name="conversionService")
public ConversionService getConversionService() {
    ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();
    bean.setConverters(Collections.singleton(new CustomStringToCollectionConverter()));
    bean.afterPropertiesSet();
    return bean.getObject();
}

其中CustomStringToCollectionConverter是Spring
StringToCollectionConverter的副本,但是没有拆分,但是,Spring转换器仍会优先被调用。

出于预感,我还尝试将“ mvcConversionService”作为Bean名称,但这也没有任何改变。


阅读 528

收藏
2020-05-30

共1个答案

小编典典

您可以在WebMvcConfigurerAdapter.addFormatters(FormatterRegistry登录)方法中删除StringToCollectionConverter并将其替换为您自己的:

像这样:

@Configuration
public class MyWebMvcConfig extends WebMvcConfigurerAdapter {
  @Override
  public void addFormatters(FormatterRegistry registry) {
    registry.removeConvertible(String.class,Collection.class);
    registry.addConverter(String.class,Collection.class,myConverter);
  }
}
2020-05-30