2
我有一個標準的Spring MVC控制器(即服務REST調用),如下所示:@RequestParam失敗了HttpServletRequestWrapper
@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( 「用戶名」),注入的結果進入「用戶名」方法參數。
但我原來的要求是不是包含一個「用戶名」參數。我查找另一個請求參數,構造一個「用戶名」值並將其設置在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參數總是空。我已確認
- 過濾器已成功調用。
- Spring使用一些其他參數名稱調用我的匿名實現HttpServletRequestWrapper.getParameter(String name),但從未使用「username」。
- Spring does 不是調用我的匿名實現HttpServletRequestWrapper.getParameterMap()。不知道是否應該。
- 「request」參數(在getMessage()方法中)是 HttpServletRequestWrapper的一個實例。
我想知道會出現什麼問題?
注意:我只提供了相關的代碼,稍作修改以保持簡單。請忽略語法錯誤,如果有的話。