Spring framework REST 多值请求参数空数组

Spring framework REST multivalue request parameter empty array

我有一个休息端点 (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 元素,但有 none。 关于如何实现这一点有什么想法吗?

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),用 逗号 和 return 一个包含分解值的数组String。拆分一个空String的结果当然是一个空Array

当您传递两个具有相同名称的参数时,将调用 ArrayToArrayConverter,其行为与您预期的一样 returns 是一个包含两个空 Strings 的数组。

如果您想禁用默认的 StringArray 行为,您应该注册另一个 Converter 将空 String 转换为单个元素 Array.