spring的mvc。 不区分大小写的get参数映射

根据这个答案,我尝试编写我的代码:

POJO:

class MyBean{ public String getValueName() { return valueName; } public void setValueName(String valueName) { this.valueName = valueName; } String valueName; } 

内控制器:

  @ModelAttribute public MyBean createMyBean() { return new MyBean(); } @RequestMapping(value = "/getMyBean", method = RequestMethod.GET) public String getMyBean(@ModelAttribute MyBean myBean) { System.out.println(myBean.getValueName()); return "pathToJsp"; } 

web.xml配置:

  caseInsensitiveFilter com.terminal.interceptor.CaseInsensitiveRequestFilter   caseInsensitiveFilter /*  

过滤:

 @Component public class CaseInsensitiveRequestFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { filterChain.doFilter(new CaseInsensitiveHttpServletRequestWrapper(request), response); } private static class CaseInsensitiveHttpServletRequestWrapper extends HttpServletRequestWrapper { private final LinkedCaseInsensitiveMap params = new LinkedCaseInsensitiveMap(); /** * Constructs a request object wrapping the given request. * * @param request * @throws IllegalArgumentException if the request is null */ private CaseInsensitiveHttpServletRequestWrapper(HttpServletRequest request) { super(request); params.putAll(request.getParameterMap()); } @Override public String getParameter(String name) { String[] values = getParameterValues(name); if (values == null || values.length == 0) { return null; } return values[0]; } @Override public Map getParameterMap() { return Collections.unmodifiableMap(this.params); } @Override public Enumeration getParameterNames() { return Collections.enumeration(this.params.keySet()); } @Override public String[] getParameterValues(String name) { return (String[]) params.get(name); } } } 

在调试中我看到filter方法调用但我无法实现case insentive get参数映射。

例如localhost:8081/getMyBean?valueName=trololo有效但localhost:8081/getMyBean?valuename=trololo – not

我相信你的问题是@ModelAttribute 。 您要求Spring将参数映射到MyBean对象,并且此对象内的属性为valueName

为了将Springreflection到对象的params,它需要在正确的情况下。

你有2个选择:

  • 将属性名称更改为MyBean对象中的valuename ,并将所有属性名称更改为小写,它应该在您的解决方案的帮助下工作。
  • 删除@ModelAttribute并为每个属性放置@RequestParam 。 如果你有很多道具,这可能会很痛苦。

这是你可以做的……

使用所有小写变量创建域(POJO)

 public class MyBean{ private String valuename; public String getValuename() { return valuename; } public void setValuename(String valuename) { this.valuename = valuename; } } 

然后创建一个将扩展HttpServletRequestWrapper的类

 public class CustomWrappedRequest extends HttpServletRequestWrapper { private final Map modifiableParameters; private Map allParameters = null; public CustomWrappedRequest(final HttpServletRequest request, final Map additionalParams) { super(request); modifiableParameters = new TreeMap(); modifiableParameters.putAll(additionalParams); } @Override public String getParameter(final String name) { String[] strings = getParameterMap().get(name); if (strings != null) { return strings[0]; } return super.getParameter(name); } @Override public Map getParameterMap() { if (allParameters == null) { allParameters = new TreeMap(); allParameters.putAll(super.getParameterMap()); allParameters.putAll(modifiableParameters); } return Collections.unmodifiableMap(allParameters); } @Override public Enumeration getParameterNames() { return Collections.enumeration(getParameterMap().keySet()); } @Override public String[] getParameterValues(final String name) { return getParameterMap().get(name); } } 

最后使用适当的web.xml配置添加filter, doFilter()将如下所示

 public void doFilter(ServletRequest request, ServletResponse reponse, FilterChain chain) throws IOException, ServletException { Map params = request.getParameterMap(); Map extraParams = new TreeMap(); Iterator i = params.keySet().iterator(); while ( i.hasNext() ) { String key = (String) i.next(); String value = ((String[]) params.get( key ))[ 0 ]; extraParams.put(key.toLowerCase(), new String[] {value}); } HttpServletRequest wrappedRequest = new CustomWrappedRequest((HttpServletRequest)request, extraParams); chain.doFilter(wrappedRequest, reponse); } 

这里的filter会将参数转换为小写并将其附加到您自定义的请求中。 然后使用可以在控制器代码中使用@ModelAttribute来获取所需的对象。

希望能帮助到你 :)

实际上,您必须根据bean变量名更改CaseInsensitiveRequestFilter类中的内容。 在您的情况下,变量是valueName ,因此对于每个请求,它将根据您的变量setter方法驼峰案例注入转换它,然后根据您的请求进行匹配。 只需尝试您的自定义要求:

 package biz.deinum.web.filter; import java.io.IOException; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import org.springframework.util.LinkedCaseInsensitiveMap; import org.springframework.web.filter.OncePerRequestFilter; public class CaseInsensitiveRequestFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { filterChain.doFilter(new CaseInsensitiveHttpServletRequestWrapper(request), response); } private static class CaseInsensitiveHttpServletRequestWrapper extends HttpServletRequestWrapper { private final LinkedCaseInsensitiveMap params = new LinkedCaseInsensitiveMap<>(); private CaseInsensitiveHttpServletRequestWrapper(HttpServletRequest request) { super(request); Map map = request.getParameterMap(); Set set = map.entrySet(); Iterator it = set.iterator(); Map tempMap = new HashMap(); while (it.hasNext()) { Map.Entry entry = (Entry) it.next(); String key = entry.getKey(); // Keep your parameter bean name here in your case it is "valueName" String beanParamaterName = "valueName"; if(key.equalsIgnoreCase(beanParamaterName)){ tempMap.put(key.toLowerCase(), entry.getValue()); } } params.putAll(tempMap); } @Override public String getParameter(String name) { String[] values = getParameterValues(name); System.out.println(values.toString()+"-"); if (values == null || values.length == 0) { return null; } return values[0]; } @Override public Map getParameterMap() { return Collections.unmodifiableMap(this.params); } @Override public Enumeration getParameterNames() { return Collections.enumeration(this.params.keySet()); } @Override public String[] getParameterValues(String name) { System.out.println(name); return (String[])params.get(name); } } }