2016-02-05 65 views
0

我休息端點(彈簧引導1.3.0-RELEASE - >彈簧芯4.2.4.RELEASE),這需要多重實例字符串參數Spring框架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的東西時,我在那裏看到單個null值(?testParam =) – silverdrop

回答

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

+1

謝謝Ali。我現在明白這個問題。 – silverdrop