将@RequestParam转换为小写

pre*_*oid 1 spring spring-mvc spring-boot

我有@RequestParam很多控制器需要强制读取为小写(例如@RequestParam String email)。除了前往每个端点并将参数的值设置为小写版本之外,还有更简单的方法吗?

我尝试的是创建一个过滤器,它传递一个HttpServletRequestWrapper重写getParameter并将其传递到链下的过滤器,但我发现与@RequestParam无关getParameter(),也许Spring在这里使用了反射?

有什么建议么?

Kla*_*aus 5

我会选择为 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)