2016-02-05 4 views
0

отдыхаю конечной точки (весна-загрузочное 1.3.0-RELEASE -> весна-ядро-4.2.4.RELEASE), которая принимает несколько параметров экземпляра строкиSpring Framework REST многозначный параметр запроса пустой массив

@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 в массиве, но его нет. Любые идеи о том, как достичь этого?

+0

Убедитесь, что ваш браузер или клиент http не отбрасывает пустой параметр. – JVXR

+0

Я не думаю, что это так. При использовании чего-то типа @RequestParam Map params, я вижу одно единственное нулевое значение там (? TestParam =) – silverdrop

ответ

1

Весна 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 s.

Если вы хотите отключить по умолчанию String для Array поведения, вы должны зарегистрировать другой Converter, который преобразует пустой String к одному элементу Array.

+1

Спасибо, Али. Теперь я понимаю этот вопрос. – silverdrop