Spring (создание номера телефона Google Lib) с использованием фильтра для изменения переменной экземпляра модели - PullRequest
0 голосов
/ 01 июня 2018

В настоящее время я пытаюсь изменить (с помощью фильтра Spring) некоторые переменные запроса, размещаемые в форме.

В связи с этим я хотел бы улучшить проверку телефонных номеров и лучше контролировать форматирование телефонных номеров.Для этой части головоломки я намереваюсь использовать номер телефона Google Lib в моей модели, например, так:

 private PhoneNumber mobileNumber;

Один получатель, без упоминания префикса вообще, учитывая, что фильтр, надеюсь, будет делатьтяжелая работа для меня.

Первоначально я думал, что, возможно, я мог бы использовать для этого конвертер атрибутов, то есть

@Convert(converter = PhoneNumberConverter.class )
 private PhoneNumber mobileNumber;

Однако, есть проблема с этим, в том случае, если полеявляется составным типом, JPA не поддерживает его: https://github.com/javaee/jpa-spec/issues/105 (compositie, поскольку необходим PREFIX, а также NUMBER) для создания объекта телефона lib.

Итак.Фильтр (или перехватчик?) - вот что у меня осталось.Мой вопрос заключается в том, что я новичок в среде Spring и не уверен на 100%, позволит ли простое изменение необработанного запроса создать экземпляр объекта PhoneNumber в модели (я полагаю, нет), но есть какие-либо указания о том, как Spring управляетбыло бы полезно сделать магическое связывание переменных запроса с объектом (путем сопоставления методов получения и установки), и как бы я делал это вручную в фильтре.Есть ли какой-нибудь способ доступа к этому объекту Model в фильтре, чтобы я мог установить его напрямую?

   public class PhonePrefixFilter extends OncePerRequestFilter
    {

        @Override
        protected void doFilterInternal( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain )
                throws ServletException, IOException
        {
            String prefix = request.getParameter( "phonePrefix" );
            if( StringUtils.isNotEmpty( prefix ) )
                request.setAttribute( "mobileNumber", prefix + request.getAttribute( "mobileNumber" ) );

            filterChain.doFilter( request, response );

        }

    }

1 Ответ

0 голосов
/ 09 июня 2018

AFAIK, вы не можете изменять параметры запроса напрямую.Вам нужно HttpServletRequestWrapper, чтобы предоставить пользовательский геттер для вашего параметра:

public static class PhoneRequestWrapper extends HttpServletRequestWrapper {

    public PhoneRequestWrapper(HttpServletRequest request) {
        super(request);
    }

    @Override
    public String getParameter(String name) {
        if (!("mobileNumber").equals(name)) {
            return super.getParameter(name);
        }
        String prefix = getParameter("phonePrefix");
        String mobileNumber = getRequest().getParameter("mobileNumber");
        if (StringUtils.isNotEmpty(prefix) && StringUtils.isNotEmpty(mobileNumber)) {
            return prefix + getRequest().getParameter("mobileNumber");
        } else {
            return mobileNumber;
        }
    }
}

Затем создайте свой фильтр:

public static class PhoneNumberFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws
                                                                                                    ServletException,
                                                                                                    IOException {
        filterChain.doFilter(new PhoneRequestWrapper((HttpServletRequest) request), response);
    }

    @Override
    public void destroy() {

    }
}

И зарегистрируйте его в своем классе @Configuration:

@Bean
public Filter filterRegistrationBean() {
   return new PhoneNumberFilter();
}

С этого момента к вашему request.getParamter("mobileNumber") будет добавлено значение phonePrefix

Поскольку ваш вопрос не очень понятен, если вы хотите изменить поведение @RequestParam, чтобы получитьВаш номер телефона, вы можете использовать пользовательский HandlerMethodArgumentResolver для разрешения вашего параметра

...