我有一个标准的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控制器方法中的username参数始终为null。我已经确认
筛选器已成功调用。
Spring使用其他几个参数名称调用我的HttpServletRequestWrapper.getParameter(String name)匿名实现,但从未使用“ username”调用。
Spring不会调用HttpServletRequestWrapper.getParameterMap()的匿名实现。不知道是否应该。
“ request”参数(在getMessage()方法中)是的一个实例
HttpServletRequestWrapper。
我想知道怎么回事?
注意:为了使问题保持简单,我仅介绍了相关代码并进行了一些修改。请忽略语法错误(如果有)。
最佳答案
我很惊讶代码被编译。
从给出的代码return getParameterMap().get(name);
应该返回一个String [],但是包含该代码的方法正在返回一个String。
我可能会丢失一些东西。