CSE下RequestContextHolder.getRequestAttributes()爲null

Springmvc它有對request和response這些對象進行上下文存儲;

可以通過下面代碼獲取到request和response

RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
HttpServletResponse response = ((ServletRequestAttributes)requestAttributes).getResponse();

但是RequestContextHolder.getRequestAttributes();這個一直NULL ,我用的CSE框架,測試過SpringBoot,不用註冊監聽器能正常獲取到,但CSE真的頭疼,看了很多博客,說是要注入監聽器

@Bean
public RequestContextListener requestContextListener(){ return new RequestContextListener(); }

好吧,我也試了,也是沒用,後面就像把它copy處理,自己設置,最後也是沒用,一直null,後面看到RequestContextHolder的setRequestAttributes方法有個參數是是否子線程共享,所以我就在自定義的RequestContextListener裏面設置:

RequestContextHolder.setRequestAttributes(attributes,true);

最後還是null,就懷疑可能在監聽器後面還有什麼地方有設置這個值,找到後面發現都過了一個類:RequestContextFilter,這裏面會再次設置一遍,

所以解決辦法就是替換掉這個過濾器就可以了。

@Bean
public RequestContextFilter requestContextFilter(){
    RequestContextFilter requestContextFilter = new RequestContextFilter();
    requestContextFilter.setThreadContextInheritable(true);
    return requestContextFilter;
}

後面我也是過使用過濾器來設置response和request,很當然的還是null,所以最後還是使用了RequestContextHolder,我也不懂,項目上又辣麼急,只能這樣處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章