2014-10-28 54 views
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參數總是空。我已確認

  1. 過濾器已成功調用。
  2. Spring使用一些其他參數名稱調用我的匿名實現HttpServletRequestWrapper.getParameter(String name),但從未使用「username」。
  3. Spring does 不是調用我的匿名實現HttpServletRequestWrapper.getParameterMap()。不知道是否應該。
  4. 「request」參數(在getMessage()方法中)是 HttpServletRequestWrapper的一個實例。

我想知道會出現什麼問題?

注意:我只提供了相關的代碼,稍作修改以保持簡單。請忽略語法錯誤,如果有的話。

回答

1

我很驚訝代碼編譯。 從代碼呈現

return getParameterMap().get(name);

應該返回一個String []還包含代碼的方法返回一個字符串。

雖然我可能錯過了一些東西。