Преобразование @RequestParam в нижний регистр - PullRequest
0 голосов
/ 05 мая 2020

У меня много @RequestParam на многих контроллерах, которые мне нужно заставить читаться в нижнем регистре (например, @RequestParam String email). Есть ли более простой способ, кроме перехода к каждой конечной точке и установки значения параметра для версии в нижнем регистре?

Я пробовал создать фильтр, который передает HttpServletRequestWrapper, который отменяет getParameter и передает его по цепочке, но я обнаружил, что @RequestParam не имеет ничего общего с getParameter(), возможно, Spring использует здесь отражение?

Есть предложения?

1 Ответ

2 голосов
/ 05 мая 2020

Я бы сделал go с @InitBinder и PropertyEditorSupport, предусмотренными для java beans. Если я правильно понял, вы хотите, чтобы все параметры @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 do c об аннотации

Такие методы init-binder поддерживают все аргументы, которые поддерживает RequestMapping, за исключением объектов команд / форм и соответствующих объектов результатов проверки. Методы init-binder не должны иметь возвращаемого значения; они обычно объявляются как void.

@InitBinder
public void initBinder( WebDataBinder dataBinder )
{
    StringLowerCaseEditor lowerCaseEditor = new StringLowerCaseEditor();
    dataBinder.registerCustomEditor( String.class, lowerCaseEditor );
}

Или, чтобы иметь глобальное влияние, добавьте @InitBinder Method в @ControllerAdvice класс. Это будет выполняться при вызове каждого контроллера. У вас есть мелкозернистый элемент управления для пакетов, который также нуждается в этом, через @ControllerAdvice(basePackages = "" )

@ControllerAdvice
public class AllControllerAdvice
{
    @InitBinder
    public void initBinder( WebDataBinder dataBinder )
    {
        StringLowerCaseEditor lowerCaseEditor = new StringLowerCaseEditor();
        dataBinder.registerCustomEditor( String.class, lowerCaseEditor );
    }
}

. Если вы хотите обрабатывать только определенные c @RequestParam, вы можете использовать @InitBinder с ожидаемый параметр

@InitBinder( "customerEmail" ) // Request param, can be comma separated
public void initBinder( WebDataBinder dataBinder )
{
    StringLowerCaseEditor lowerCaseEditor = new StringLowerCaseEditor();
    dataBinder.registerCustomEditor( String.class, lowerCaseEditor );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...