@RequestParam失败了HttpServletRequestWrapper

时间:2014-10-28 00:16:23

标签: java spring spring-mvc

我有一个标准的Spring MVC控制器(为REST调用提供服务),如下所示:

@Controller
public class SpringRestController {
    @RequestMapping({"/message"})
    @ResponseBody
    public Message getMessage(@RequestParam(required=false) String username, HttpServletRequest request) {
        return new Message("Hello " + username);
    }
}

我的理解是Spring MVC将调用HttpServletRequest.getParameter(" username")并将结果注入"用户名"方法参数。

但我的原始请求包含"用户名"参数。我查找另一个请求参数,构建一个"用户名" value并将其设置在HttpServletRequestWrapper实现中(使用自定义过滤器)。像这样:

public class UserResolvingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        filternChain.doFilter(
            new HttpServletRequestWrapper(request) {
                @Override
                public String getParameter(String name) {
                    return getParameterMap().get(name);
                }
                @Override
                public Map<String, String[]> getParameterMap() {
                    Map<String, String[]> map = new HashMap(super.getParameterMap());
                    // Simplified for brevity
                    map.put("username", new String[] {"testUserName"});
                    return map;
                }                   

            },
            response
        );
    }
}

过滤器在web.xml中配置如下:

<filter>
    <filter-name>userResolvingFilter</filter-name>
    <filter-class>my.package.UserResolvingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>userResolvingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

问题:我的getMessage控制器方法中的username参数始终为null。我已经确认了

  1. 成功调用过滤器。
  2. Spring使用其他几个参数名称调用我的HttpServletRequestWrapper.getParameter(String name)的匿名实现,但从不使用&#34; username&#34;。
  3. Spring 调用我的HttpServletRequestWrapper.getParameterMap()的匿名实现。不确定是否应该。
  4. &#34;请求&#34; parameter(在getMessage()方法中)是一个实例 了HttpServletRequestWrapper。
  5. 我想知道会出现什么问题?

    注意:我只是略微修改了相关代码以保持简单。请忽略语法错误,如果有的话。

1 个答案:

答案 0 :(得分:1)

我很惊讶代码编译。 从提供的代码

return getParameterMap().get(name);

应该返回一个String [],但包含该代码的方法返回一个String。

我可能会遗漏一些东西。

相关问题