Spring 将@RequestParam转换为小写

Spring 将@RequestParam转换为小写,spring,spring-boot,spring-mvc,Spring,Spring Boot,Spring Mvc,我在许多控制器上有许多@RequestParam,我需要强制执行这些控制器才能将其作为小写字母(例如@RequestParam-String-email)。除了转到每个端点并将参数值设置为小写版本之外,还有更简单的方法吗 我尝试的是创建一个过滤器,它传递一个覆盖getParameter的HttpServletRequestWrapper,并沿着链传递它,但我发现@RequestParam与getParameter()无关,可能Spring在这里使用反射 有什么建议吗?我会选择为java bean

我在许多控制器上有许多
@RequestParam
,我需要强制执行这些控制器才能将其作为小写字母(例如
@RequestParam-String-email
)。除了转到每个端点并将参数值设置为小写版本之外,还有更简单的方法吗

我尝试的是创建一个过滤器,它传递一个覆盖
getParameter
HttpServletRequestWrapper
,并沿着链传递它,但我发现
@RequestParam
getParameter()
无关,可能Spring在这里使用反射


有什么建议吗?

我会选择为java bean提供的
@InitBinder
属性编辑器支持。如果我理解正确,您希望所有的
@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方法支持请求映射的所有参数 支持,但命令/窗体对象和相应的验证除外 结果对象。Init binder方法不能有返回值;他们 通常被宣布为无效

或者,为了产生全局影响,将
@InitBinder方法添加到
@ControllerAdvice
类中。这将在调用每个控制器时执行。通过
@ControllerAdvice(basePackages=“”)

如果只想处理特定的
@RequestParam
,可以将
@InitBinder
与预期的参数一起使用

@InitBinder( "customerEmail" ) // Request param, can be comma separated
public void initBinder( WebDataBinder dataBinder )
{
    StringLowerCaseEditor lowerCaseEditor = new StringLowerCaseEditor();
    dataBinder.registerCustomEditor( String.class, lowerCaseEditor );
}

我将使用为Javabean提供的
@InitBinder
属性编辑器支持。如果我理解正确,您希望所有的
@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方法支持请求映射的所有参数 支持,但命令/窗体对象和相应的验证除外 结果对象。Init binder方法不能有返回值;他们 通常被宣布为无效

或者,为了产生全局影响,将
@InitBinder方法添加到
@ControllerAdvice
类中。这将在调用每个控制器时执行。通过
@ControllerAdvice(basePackages=“”)

如果只想处理特定的
@RequestParam
,可以将
@InitBinder
与预期的参数一起使用

@InitBinder( "customerEmail" ) // Request param, can be comma separated
public void initBinder( WebDataBinder dataBinder )
{
    StringLowerCaseEditor lowerCaseEditor = new StringLowerCaseEditor();
    dataBinder.registerCustomEditor( String.class, lowerCaseEditor );
}

是否希望@RequestParameters不区分大小写?或者您希望将请求参数的值转换为小写形式?@jetro157我希望这些值是小写形式的,因此无论何时使用它们,都可以保证我处理的是小写形式。并且只有某些参数,而不是控制器中的所有参数。是否希望@RequestParameters不区分大小写?或者您希望将请求参数的值转换为小写形式?@jetro157我希望这些值是小写形式的,因此无论何时使用它们,都可以保证我处理的是小写形式。而且只有某些参数,而不是控制器内的所有参数。有趣的方法,但我不希望所有RequestParams都是小写,我只希望某些参数是小写。例如,所有接收电子邮件参数的端点的值都应为小写。。通过这种方式,我保证数据库中保存的所有电子邮件都是小写的,而不必在每个端点中自己将其小写(db只是一个例子,即使我记录电子邮件时,我希望它是用小写写的)。可能吗?感谢you@prettyvoid我已经更新了我的答案,请有一个有趣的方法,但我不希望所有的RequestParams都是小写的,我只希望某些是小写的。例如,所有接收电子邮件参数的端点的值都应为小写。。通过这种方式,我保证数据库中保存的所有电子邮件都是小写的,而不必在每个端点中自己将其小写(db只是一个例子,即使我记录电子邮件时,我希望它是用小写写的)。可能吗?感谢you@prettyvoid我已经更新了我的答案,请看一看