首页 > 解决方案 > 将@RequestParam 转换为小写

问题描述

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

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

有什么建议么?

标签: springspring-bootspring-mvc

解决方案


我会选择@InitBinderPropertyEditorSupport为 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 Methodto@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 );
}

推荐阅读