URL中的编码逗号在Spring中被读为List

时间:2016-05-05 19:22:56

标签: java spring url

我在Spring中有一个REST组件。简化,它看起来像这样:

@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个值的列表(&#34;值&#34;,&#34; 1&#34;)。将任何内容放在引号或转义引号中都有类似的问题。当我有多个参数并使用多值模式时它看起来很有效,但不是在我使用逗号分隔模式时。

1 个答案:

答案 0 :(得分: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