我有一个标准的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。我已经确认了
我想知道会出现什么问题?
注意:我只是略微修改了相关代码以保持简单。请忽略语法错误,如果有的话。
答案 0 :(得分:1)
我很惊讶代码编译。 从提供的代码
return getParameterMap().get(name);
应该返回一个String [],但包含该代码的方法返回一个String。
我可能会遗漏一些东西。