Spring(实例化Google Lib phone number)使用Filter改变一个Model实例变量
Spring (instantiation of Google Lib phone number) using a Filter to change a Model instance variable
我目前正在尝试修改(通过 Spring 过滤器)一些发布到表单中的请求变量。
原因是,我想实施更好的 phone 号码验证,并更好地控制 telephone 号码的格式。对于这部分难题,我打算在我的模型中使用 Google 的 Lib phone 编号,如下所示:
private PhoneNumber mobileNumber;
一个 getter,完全没有提及前缀,因为过滤器有望为我完成繁重的工作。
我最初认为也许我可以使用属性转换器来做到这一点,即
@Convert(converter = PhoneNumberConverter.class )
private PhoneNumber mobileNumber;
但是,这有一个问题,如果字段是复合类型,JPA 不支持它:https://github.com/javaee/jpa-spec/issues/105(复合类型,因为需要 PREFIX 以及 NUMBER)来构建一个库 phone 对象。
所以。过滤器(或拦截器?)是我剩下的。我的问题是,我是 Spring 框架的新手,我不能 100% 确定仅修改原始请求是否会允许在模型中实例化 PhoneNumber 对象 -(我想不是),但任何指导关于 Spring 如何设法将请求变量绑定到一个对象中(通过映射 getters 和设置器)以及我将如何在过滤器中手动执行此操作会有所帮助。有没有办法在过滤器中访问这个模型对象,以便我可以直接设置它?
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 );
}
}
据我所知,您不能直接修改您的请求参数。您需要一个 HttpServletRequestWrapper
来为您的参数提供自定义 getter:
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
class 中注册:
@Bean
public Filter filterRegistrationBean() {
return new PhoneNumberFilter();
}
从现在开始,您的 request.getParamter("mobileNumber")
的值将附加 phonePrefix
由于你的问题不是很清楚,如果你想覆盖@RequestParam
的行为来获取你的phone数字字符串,你可以使用自定义HandlerMethodArgumentResolver
来解析你的参数
我目前正在尝试修改(通过 Spring 过滤器)一些发布到表单中的请求变量。
原因是,我想实施更好的 phone 号码验证,并更好地控制 telephone 号码的格式。对于这部分难题,我打算在我的模型中使用 Google 的 Lib phone 编号,如下所示:
private PhoneNumber mobileNumber;
一个 getter,完全没有提及前缀,因为过滤器有望为我完成繁重的工作。
我最初认为也许我可以使用属性转换器来做到这一点,即
@Convert(converter = PhoneNumberConverter.class )
private PhoneNumber mobileNumber;
但是,这有一个问题,如果字段是复合类型,JPA 不支持它:https://github.com/javaee/jpa-spec/issues/105(复合类型,因为需要 PREFIX 以及 NUMBER)来构建一个库 phone 对象。
所以。过滤器(或拦截器?)是我剩下的。我的问题是,我是 Spring 框架的新手,我不能 100% 确定仅修改原始请求是否会允许在模型中实例化 PhoneNumber 对象 -(我想不是),但任何指导关于 Spring 如何设法将请求变量绑定到一个对象中(通过映射 getters 和设置器)以及我将如何在过滤器中手动执行此操作会有所帮助。有没有办法在过滤器中访问这个模型对象,以便我可以直接设置它?
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 );
}
}
据我所知,您不能直接修改您的请求参数。您需要一个 HttpServletRequestWrapper
来为您的参数提供自定义 getter:
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
class 中注册:
@Bean
public Filter filterRegistrationBean() {
return new PhoneNumberFilter();
}
从现在开始,您的 request.getParamter("mobileNumber")
的值将附加 phonePrefix
由于你的问题不是很清楚,如果你想覆盖@RequestParam
的行为来获取你的phone数字字符串,你可以使用自定义HandlerMethodArgumentResolver
来解析你的参数