pre*_*oid 1 spring spring-mvc spring-boot
我有@RequestParam
很多控制器需要强制读取为小写(例如@RequestParam String email
)。除了前往每个端点并将参数的值设置为小写版本之外,还有更简单的方法吗?
我尝试的是创建一个过滤器,它传递一个HttpServletRequestWrapper
重写getParameter
并将其传递到链下的过滤器,但我发现与@RequestParam
无关getParameter()
,也许Spring在这里使用了反射?
有什么建议么?
我会选择为 java beans 提供的@InitBinder
和。PropertyEditorSupport
如果我理解正确的话,你希望所有@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() );
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在@Controller
类中,可以使用带有注释的方法来@InitBinder
处理传入该控制器的所有请求。来自spring关于注释的文档
此类 init-binder 方法支持 RequestMapping 支持的所有参数,但命令/表单对象和相应的验证结果对象除外。Init-binder 方法不能有返回值;它们通常被宣布为无效。
@InitBinder
public void initBinder( WebDataBinder dataBinder )
{
StringLowerCaseEditor lowerCaseEditor = new StringLowerCaseEditor();
dataBinder.registerCustomEditor( String.class, lowerCaseEditor );
}
Run Code Online (Sandbox Code Playgroud)
或者,要产生全球影响,请将 添加@InitBinder Method
到@ControllerAdvice
类中。这将在调用每个控制器时执行。您还可以通过以下方式对需要此功能的软件包进行细粒度控制@ControllerAdvice(basePackages = "" )
@ControllerAdvice
public class AllControllerAdvice
{
@InitBinder
public void initBinder( WebDataBinder dataBinder )
{
StringLowerCaseEditor lowerCaseEditor = new StringLowerCaseEditor();
dataBinder.registerCustomEditor( String.class, lowerCaseEditor );
}
}
Run Code Online (Sandbox Code Playgroud)
如果您只想处理特定的,您可以将与预期参数一起@RequestParam
使用。@InitBinder
@InitBinder( "customerEmail" ) // Request param, can be comma separated
public void initBinder( WebDataBinder dataBinder )
{
StringLowerCaseEditor lowerCaseEditor = new StringLowerCaseEditor();
dataBinder.registerCustomEditor( String.class, lowerCaseEditor );
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3328 次 |
最近记录: |