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

b4wnujal  于 12个月前  发布在  Spring
关注(0)|答案(3)|浏览(186)

我们基本上有与this question相同的问题,但对于列表和其他问题,我们正在寻找一个全局解决方案。
目前我们有一个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,它将使用“,”作为分隔符分割参数。
如何配置Sping Boot 以忽略参数中的逗号?如果可能的话,解决方案应该是全局的。

我们尝试了什么:

This question对我们不起作用,因为我们有一个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名称,但这也没有改变任何东西。

vawmfj5a

vawmfj5a1#

您可以删除StringToCollectionConverter,并在WebMvcConfigurerAdapter.addFormatters(WebMvcConfigurerRegistry注册表)方法中将其替换为您自己的方法:
就像这样:

@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);
  }
}

字符串

vpfxa7rd

vpfxa7rd2#

这是一个简短的版本,感谢@Strelok

import java.util.Collection;
import java.util.Collections;

import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.removeConvertible(String.class, Collection.class);
        registry.addConverter(String.class, Collection.class, Collections::singletonList);
    }
}

字符串

mo49yndu

mo49yndu3#

我设法解决了这个问题,通过应用以下:how-to-prevent-parameter-binding-from-interpreting-commas-in-spring-3-0-5
这个技巧是由下面的代码行完成的

@InitBinder
public void initBinder(WebDataBinder binder) {
  binder.registerCustomEditor(String[].class, new StringArrayPropertyEditor(null));
}

字符串
更多信息:为什么转义逗号是@RequestParam列表的逗号?

相关问题