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

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

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

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

这是用来消耗一个任意长度的字符串列表。你可以用很多方法来实现:

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

  1. localhost:8080/route?value=this,that

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

vx6bjr1n

vx6bjr1n1#

编辑:我不知道为什么要创建一个域对象,还要经历编码和解码整个列表的麻烦。你可以简单地对每个参数进行Base64编码,并在读入时决定每个参数。
根据我上面的评论,我能够实现一个解决方案。我对这个实现不是特别满意,但是它完成了工作。我想重申的是,几乎可以肯定有一个更好的解决方案,可以遵循关于域对象和值的编组和解组的更显式的方法。
假设值列表被格式化为值对象的JSON列表,例如:

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

Base64编码为:

  1. W3sidmFsdWUiOiJ0ZXN0LDEifSx7InZhbHVlIjogInRlc3QsMiJ9XQ==

我的控制器设置为:

  1. @RequestMapping(value = "/test", method = RequestMethod.GET)
  2. @ResponseBody
  3. public String test(@RequestParam(value = "values", required = true) String values) throws JsonParseException, JsonMappingException, IOException{
  4. byte[] bValues = Base64.getDecoder().decode(values.getBytes());
  5. String json = new String(bValues);
  6. ObjectMapper mapper = new ObjectMapper();
  7. List<Value> myObjects = mapper.readValue(json, new TypeReference<List<Value>>(){});
  8. StringBuilder result = new StringBuilder();
  9. int i = 1;
  10. for (Value value : myObjects){
  11. result.append("value ");
  12. result.append(" ");
  13. result.append(i++);
  14. result.append(": ");
  15. result.append(value.getValue());
  16. result.append("<br>");
  17. }
  18. result.setLength(result.length() - 1);
  19. return result.length() > 0 ? result.toString() : "Test";
  20. }
  21. public static void main(String[] args) {
  22. SpringApplication.run(UatproxyApplication.class, args);
  23. }

Value类别为:

  1. public class Value implements Serializable{
  2. private static final long serialVersionUID = -7342446805363029057L;
  3. private String value;
  4. public Value(){
  5. }
  6. public String getValue() {
  7. return value;
  8. }
  9. public void setValue(String value) {
  10. this.value = value;
  11. }

}
请求是:

  1. /test?values=W3sidmFsdWUiOiJ0ZXN0LDEifSx7InZhbHVlIjogInRlc3QsMiJ9XQ==

而回应是:

  1. value 1: test,1
  2. value 2: test,2
展开查看全部
slmsl1lt

slmsl1lt2#

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

  1. import org.springframework.boot.convert.Delimiter;
  2. @RequestMapping(value = "/route", method = RequestMethod.GET)
  3. public Object thisIsTheMethod(@Delimiter(Delimiter.None) @RequestParam(value = "value", required = false) List<String> values) {
  4. return OtherClass.doTheThing(values);
  5. }

相关问题