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

时间:2016-02-05 16:24:06

标签: java spring rest param multivalue

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

1 个答案:

答案 0 :(得分:1)

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