gpt4 book ai didi

spring-mvc - 处理 Spring @RequestParam 的重复值

转载 作者:行者123 更新时间:2023-12-03 09:25:03 28 4
gpt4 key购买 nike

我有一个 Spring 3.2 Controller ,具有基本的请求映射,例如

@RequestMapping("/action")
public String action(@RequestParam("param") String param) {
//do stuff...
return "view";
}

该 Controller 处理非技术业务用户创建的链接。有时,用户会搞砸并创建带有重复参数的链接,例如

www.example.com/action?param=value&param=value

该参数完全重复,可能是复制/粘贴错误。

我的问题是 Spring 将这些欺骗连接在一起,因此上面的 url 将给出 "value,value"对于 param ,当我只想要"value"时.

检测和处理这些重复项的好方法是什么?我知道我可以更改所有 @RequestParam发送至List<String> s 并从那里开始,但这是涉及数十个请求映射的大量样板。

理想情况下,有一种方法可以在 Spring 尝试绑定(bind) url 参数之前拦截并修改它们 - 但仅限于此 Controller 。

最佳答案

我发现我可以注册一个自定义字符串属性编辑器来执行此操作。

class DuplicateParameterReducingPropertyEditor extends PropertyEditorSupport {

Object value;

@Override
public void setValue(Object value) {
if (value instanceof String[]) {
String[] strings = (String[])value;
Set<String> unique = Sets.newHashSet(strings);
this.value = unique.toArray();
} else {
this.value = value;
}
}

@Override
public void setAsText(String text) throws IllegalArgumentException {
this.value = text;
}

@Override
public String getAsText() {
return value.toString();
}

@Override
public Object getValue() {
return value;
}

};

我将其添加到我的 Controller 中:

@InitBinder
public void initBinder(WebDataBinder binder) {

PropertyEditor stringEditor = new DuplicateParameterReducingPropertyEditor();
binder.registerCustomEditor(String.class, stringEditor);
}

所以每当 Spring 遇到 @RequestParam - 带注释的 String 方法参数,PropertyEditor如果需要的话,被调用来转换传入的数据。在参数重复的情况下,Spring 会传递 String[]属性编辑器的值 setValue ,然后我可以对其进行操作。

这确实有我正在寻找的结果。不过,我不确定这会产生什么影响,所以我还不能认可它是一个好的解决方案。不过,不必更改任何处理程序方法签名是一个很大的优点。

关于spring-mvc - 处理 Spring @RequestParam 的重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22817430/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com