spring - 将@RequestParam 转换为小写
问题描述
我有@RequestParam
很多控制器需要强制读取为小写(例如@RequestParam String email
)。除了转到每个端点并将参数的值设置为小写版本之外,还有更简单的方法吗?
我尝试的是创建一个过滤器,它通过一个HttpServletRequestWrapper
覆盖getParameter
并将其传递到链中,但我发现这与它@RequestParam
无关getParameter()
,也许 Spring 在这里使用反射?
有什么建议么?
解决方案
我会选择@InitBinder
并PropertyEditorSupport
为 java bean 提供。如果我理解正确,您希望所有@RequestParam
参数都是小写的。为此,我将声明我自己的StringLowerCaseEditor
类如下
public class StringLowerCaseEditor extends PropertyEditorSupport
{
@Override
public String getAsText()
{
return getValue().toString();
}
@Override
public void setAsText( String text ) throws IllegalArgumentException
{
setValue( text.toLowerCase() );
}
}
然后,在@Controller
类中,可以使用带有注释的方法来@InitBinder
处理所有到达该控制器的请求。来自spring的关于注释的文档
此类 init-binder 方法支持 RequestMapping 支持的所有参数,除了命令/表单对象和相应的验证结果对象。Init-binder 方法不能有返回值;它们通常被宣布为无效。
@InitBinder
public void initBinder( WebDataBinder dataBinder )
{
StringLowerCaseEditor lowerCaseEditor = new StringLowerCaseEditor();
dataBinder.registerCustomEditor( String.class, lowerCaseEditor );
}
或者,要产生全球影响,请添加@InitBinder Method
to@ControllerAdvice
类。这将在调用每个控制器时执行。您还可以通过@ControllerAdvice(basePackages = "" )
@ControllerAdvice
public class AllControllerAdvice
{
@InitBinder
public void initBinder( WebDataBinder dataBinder )
{
StringLowerCaseEditor lowerCaseEditor = new StringLowerCaseEditor();
dataBinder.registerCustomEditor( String.class, lowerCaseEditor );
}
}
如果您只想处理特定的@RequestParam
,可以将@InitBinder
与预期的参数一起使用。
@InitBinder( "customerEmail" ) // Request param, can be comma separated
public void initBinder( WebDataBinder dataBinder )
{
StringLowerCaseEditor lowerCaseEditor = new StringLowerCaseEditor();
dataBinder.registerCustomEditor( String.class, lowerCaseEditor );
}
推荐阅读
- excel - 如何从字符串中获取值
- python - 如何在分类问题的熊猫数据框中将分类数据与压缩稀疏行矩阵混合
- swift - 在继续下一个请求或调度队列中的下一个 DispatchWorkItem 之前,我如何等待接收来自 DispatchWorkItem 的响应
- pyspark - Databricks 如何为集群做自动伸缩
- concurrency - AWS Athena 并发限制:提交的查询数 VS 正在运行的查询数
- sql - 在 SQL Server 存储过程中将输入值分配给列的值
- matlab - 在 Matlab 中结合基于索引和逻辑寻址
- android - 为什么单个 dex 文件中有多个类?
- java - Android LinearLayout,设置背景为透明
- node.js - React,从 package.json 代理到 websocket 获取本地机器