Spring框架REST多值请求参数空数组

huus2vyu  于 2023-03-11  发布在  Spring
关注(0)|答案(2)|浏览(140)

我有一个rest端点(spring-boot-1.3.0-RELEASE -〉spring-core-4.2.4.RELEASE),它接受一个多示例字符串参数

@RequestMapping(value = "/test", method = RequestMethod.GET)
public ResponseEntity<Object> getTest(@RequestParam(value = "testParam", required = false) String[] testParamArray) {}

/test?testParam=  => testParamArray has length 0
/test?testParam=&testParam=  => testParamArray has length 2 (two empty string items)

我希望第一个例子能在数组中得到一个空的sting元素,但实际上一个也没有。有什么想法可以实现吗?

epfja78i

epfja78i1#

Spring的StringToArrayConverter负责这个转换,如果你看一下它的convert方法:

public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
        if (source == null) {
            return null;
        }
        String string = (String) source;
        String[] fields = StringUtils.commaDelimitedListToStringArray(string);
        Object target = Array.newInstance(targetType.getElementTypeDescriptor().getType(), fields.length);
        for (int i = 0; i < fields.length; i++) {
            String sourceElement = fields[i];
            Object targetElement = this.conversionService.convert(sourceElement.trim(), sourceType, targetType.getElementTypeDescriptor());
            Array.set(target, i, targetElement);
        }
        return target;
}

基本上,它接受输入(在您的例子中为空String),用逗号将其拆分,并返回一个包含分解的String的值的数组。拆分空String的结果当然是空Array
当您传递两个同名参数时,将调用ArrayToArrayConverter,它的行为与您预期的一样,并返回一个包含两个空String的数组。
如果要禁用默认的StringArray行为,则应注册另一个Converter,将空String转换为单个元素Array

aiazj4mn

aiazj4mn2#

为了补充阿里的正确答案...
您可以注册一个Converter,该Converter指示Spring将空字符串视为一个数组,该数组包含WebMvcConfigurerbean的addFormatters方法中的空字符串。

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        // Register a converter so that an empty string web parameter,
        // when converted to a String[], is treated as an array with
        // one element (the empty string), instead of an empty array.
        registry.addConverter(new Converter<String, String[]>() {
            @Override
            public String[] convert(String source) {
                if (source.isEmpty()) { // Special case empty string
                    return new String[] { "" };
                }

                return StringUtils.commaDelimitedListToStringArray(source);
            }
        });
    }
}

相关问题