Spring MVC URL中的编码逗号在Spring中被读取为列表

xuo3flqw  于 2022-11-14  发布在  Spring
关注(0)|答案(2)|浏览(158)

我在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

localhost:8080/route?value=this,that

现在,假设我想传入一个包含逗号的字符串:value,1。我该怎么做呢?用% 2C替换逗号会得到一个2值的列表(“value”,“1”)。用引号或转义引号括起来也会有类似的问题。看起来当我有多个参数并使用多值模式时它会起作用,但当我使用逗号分隔模式时就不行了。

vx6bjr1n

vx6bjr1n1#

编辑:我不知道为什么要创建一个域对象,还要经历编码和解码整个列表的麻烦。你可以简单地对每个参数进行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
slmsl1lt

slmsl1lt2#

你可以设置你的Delimiter。逗号只是org.springframework.boot.convert.DelimitedStringToCollectionConverter中的默认逗号。如果你愿意,你可以完全禁用Delimiter。对于你的代码,它看起来像这样:

import org.springframework.boot.convert.Delimiter;

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

相关问题