如何禁用Spring Boot参数分割

2024-05-26

我们有许多 @RestController 接收用户编写的通用语言短语。短语可以很长并且包含标点符号,例如句号,当然还有逗号。

简化控制器示例:

@RequestMapping(value = "/countphrases", method = RequestMethod.PUT)
public String countPhrases(
    @RequestParam(value = "phrase", required = false) String[] phrase) {

  return "" + phrase.length;
}

Spring Boot 默认行为是以逗号分割参数值,因此之前的控制器使用以下 url 进行调用:

[...]/countphrases?phrase=john%20and%20me,%20you%and%her

将返回“2”而不是我们想要的“1”。事实上,使用逗号分割,前面的调用相当于:

[...]/countphrases?phrase=john%20and%20me&phrase=you%and%her

我们使用自然语言,我们需要准确分析用户如何编写短语并准确了解他们写了多少个短语。

我们尝试了这个解决方案:https://stackoverflow.com/a/42134833/1085716 https://stackoverflow.com/a/42134833/1085716适应我们的 Spring Boot 版本(2.0.5)后:

@Configuration
public class MvcConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        // we hoped this code could remove the "split strings at comma"
        registry.removeConvertible(String.class, Collection.class);
    }
}

但这不起作用。

有人知道如何在 Spring Boot 2.0.5 中全局删除“以逗号分隔字符串参数”行为吗?


我找到了解决办法。 要覆盖默认转换,我们必须添加一个新转换。如果我们只删除旧的,它就不起作用了。

正确的(示例)代码应该是:

@Configuration
public class MvcConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.removeConvertible(String.class, String[].class);
        registry.addConverter(String.class, String[].class, noCommaSplitStringToArrayConverter());
    }

    @Bean
    public Converter<String, String[]> noCommaSplitStringToArrayConverter() {
        return new Converter<String, String[]>() {
            @Override
            public String[] convert(String source) {
                String[] arrayWithOneElement = {source};
                return arrayWithOneElement;
            }
        };
    }
}

这样,任何控制器(例如主要问题中的控制器)都不会分割参数值:

  • [...]/countphrases?phrase=a,b 将返回 1 (并且 fq=["a,b"])
  • [...]/countphrases?phrase=a,b&phrase=c,d 将返回 2 (并且 fq=["a,b", "c,d"])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何禁用Spring Boot参数分割 的相关文章

随机推荐