根据this answer我尝试写我的代码:
波约:
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配置:
<filter>
<filter-name>caseInsensitiveFilter</filter-name>
<filter-class>com.terminal.interceptor.CaseInsensitiveRequestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>caseInsensitiveFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
过滤器:
@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);
}
}
}
在调试中,我看到过滤器方法被调用,但是我无法实现大小写不敏感的获取参数Map。
例如,localhost:8081/getMyBean?valueName=trololo
工作,但localhost:8081/getMyBean?valuename=trololo
不工作
4条答案
按热度按时间tp5buhyn1#
我认为您的问题是
@ModelAttribute
,您要求Spring将参数Map到MyBean
对象,而该对象中的属性是valueName
。为了让Spring将参数反映给对象,它需要使用正确的大小写。
您有两个选项:
valuename
,并将所有属性名更改为小写,在您的解决方案的帮助下应该可以正常工作。@ModelAttribute
并为每个属性放置@RequestParam
。如果你有很多 prop ,这可能会很痛苦。r7knjye22#
以下是您可以执行的操作...
创建变量全部小写的域(POJO
然后创建一个将扩展
HttpServletRequestWrapper
的类最后添加一个带有适当web.xml配置的过滤器,
doFilter()
将如下所示这里过滤器会把参数转换成小写并附加到你的定制请求中,然后你可以在控制器代码中使用
@ModelAttribute
来得到你想要的对象。希望有帮助:)
jtw3ybtb3#
实际上,你必须根据你的bean变量名来改变
CaseInsensitiveRequestFilter
类中的东西。在你的例子中,变量是valueName
,所以对于每个请求,它都会根据你的变量setter方法驼峰大小写注入来转换它,然后根据你的请求来匹配。只是尝试一下你的自定义需求:tct7dpnv4#
您的枚举参数:
添加此转换器类:
和此配置:
瞧,不区分大小写的枚举参数。