【问题标题】:@RequestParam fails with HttpServletRequestWrapper@RequestParam 因 HttpServletRequestWrapper 而失败
【发布时间】:2014-12-23 07:18:54
【问题描述】:

我有一个标准的 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") 并将结果注入到 "username" 方法参数中。

但我的原始请求确实包含“用户名”参数。我查找另一个请求参数,构造一个“用户名”值并将其设置在 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 控制器方法中的用户名参数始终为空。我已经确认了

  1. 过滤器被成功调用。
  2. Spring 使用其他几个参数名称调用我的 HttpServletRequestWrapper.getParameter(String name) 匿名实现,但从不使用“用户名”。
  3. Spring调用我的 HttpServletRequestWrapper.getParameterMap() 匿名实现。不确定是否应该。
  4. “请求”参数(在 getMessage() 方法中)是 HttpServletRequestWrapper。

我想知道可能出了什么问题?

注意:我只提供了相关代码,稍作修改以保持问题简单。如果有语法错误,请忽略。

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

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

    return getParameterMap().get(name);

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

    我可能会遗漏一些东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 2012-10-03
      • 2014-07-16
      • 2021-11-23
      • 2018-10-04
      • 2020-03-23
      • 2014-05-12
      相关资源
      最近更新 更多