2016-05-05 49 views
1

我在Spring中有一個REST組件。簡化,它看起來像這樣:URL中的編碼逗號在Spring中被讀爲列表

@RequestMapping(value = "/route", method = RequestMethod.GET) 
public Object thisIsTheMethod(RequestParam(value = "value", required = false) List<String> values) { 
    return OtherClass.doTheThing(values); 
} 

這是用來消耗任意長度的字符串列表。你可以做許多方面:

localhost:8080/route?value=this&value=that 

OR

localhost:8080/route?value=this,that 

現在讓我們說,我想在其中包含一個逗號一個字符串傳遞:value,1。我會怎麼做呢?用%2C替換逗號將得到2個值的列表(「值」,「1」)。將所有內容放在引號中或者引號內,都有類似的問題。它看起來像它有效,當我有多個參數,並使用多值模式,但不是當我使用逗號分隔模式。

+1

還沒有嘗試過,但我認爲下面應該工作。定義一個模擬請求對象的域對象(在這種情況下爲值)。創建這些對象的列表作爲JSON,Base64對其進行編碼併發送GET請求。在Spring一側,將請求參數的類類型更改爲域對象的列表。 – Andonaeus

+2

@Andonaeus:這種方式是瘋狂。也就是說,自從我開始這個項目的這個特定部分以來,我一直在考慮它。 – DrGodCarl

+0

非常相似,但也沒有解決:http://stackoverflow.com/q/33484711/2954288 – Harald

回答

0

編輯:我不知道爲什麼我困擾創建一個域對象,並經歷編碼和解碼整個列表的麻煩。同樣,你可以簡單地Base64編碼每個參數,並在讀入時決定每個參數。

根據我上面的評論,我能夠實現一個解決方案。我對實施並不特別滿意,但它完成了工作。我想重申,幾乎可以肯定有更好的解決方案,可以採用更明確的方法來處理域對象以及值的編組和解組。

假設值的列表被格式化作爲價值JSON對象列表,例如:

[{"value":"test,1"},{"value": "test,2"}] 

的base64編碼是:

W3sidmFsdWUiOiJ0ZXN0LDEifSx7InZhbHVlIjogInRlc3QsMiJ9XQ== 

控制器是否是設置爲:

@RequestMapping(value = "/test", method = RequestMethod.GET) 
@ResponseBody 
public String test(@RequestParam(value = "values", required = true) String values) throws JsonParseException, JsonMappingException, IOException{ 

    byte[] bValues = Base64.getDecoder().decode(values.getBytes()); 
    String json = new String(bValues); 
    ObjectMapper mapper = new ObjectMapper(); 
    List<Value> myObjects = mapper.readValue(json, new TypeReference<List<Value>>(){}); 
    StringBuilder result = new StringBuilder(); 

    int i = 1; 
    for (Value value : myObjects){ 
     result.append("value "); 
     result.append(" "); 
     result.append(i++); 
     result.append(": "); 
     result.append(value.getValue()); 
     result.append("<br>"); 
    } 

    result.setLength(result.length() - 1); 
    return result.length() > 0 ? result.toString() : "Test"; 
} 

public static void main(String[] args) { 
    SpringApplication.run(UatproxyApplication.class, args); 
} 

Value等級爲:

public class Value implements Serializable{ 

private static final long serialVersionUID = -7342446805363029057L; 

private String value; 

public Value(){ 

} 

public String getValue() { 
    return value; 
} 

public void setValue(String value) { 
    this.value = value; 
} 

}

請求爲:

/test?values=W3sidmFsdWUiOiJ0ZXN0LDEifSx7InZhbHVlIjogInRlc3QsMiJ9XQ== 

和響應是:

value 1: test,1 
value 2: test,2 
相關問題