2016-12-27 59 views
0

我在嵌入式Jetty設置上運行Errai Framework並運行Weld-SE環境。如何獲得對嵌入式Jetty請求範圍的引用

Errai框架使用PicketLink進行安全性,後者依次範圍@RequestScoped中的一些關鍵bean。因此,在調用安全API時,遇到「範圍錯誤沒有活動上下文」。

我的問題是我如何利用Jetty和/或Errai API手動爲我的環境在正確的線程上初始化RequestScope?

回答

0

對於任何人碰到這個絆腳石就可以啓動一個過濾器內部的@RequestScope:

public class WeldRequestScopeFilter implements Filter { 

    private static final Logger logger = LoggerFactory.getLogger(
      WeldRequestScopeFilter.class.getSimpleName()); 

    @Override 
    public void destroy() { 
     logger.trace("Filter destroyed"); 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
         FilterChain chain) throws IOException, ServletException { 

     final String url = ((HttpServletRequest) request).getRequestURL() 
       .toString(); 
     final Map<String, Object> requestDataStore = new HashMap<>(10); 

     final WeldContainer WELD = WeldContainer 
       .instance(Application.WELD_CONTAINER_ID); 
     final BoundRequestContext requestContext = WELD 
       .select(BoundRequestContext.class).get(); 

     logger.info("Activating @RequestScoped for request on {}", url); 
     requestContext.associate(requestDataStore); 
     requestContext.activate(); 

     chain.doFilter(request, response); 

     logger.info("Deactivating @RequestScoped for request on {}", url); 
     requestContext.invalidate(); 
     requestContext.deactivate(); 
     requestContext.dissociate(requestDataStore); 

    } 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
     logger.trace("Filter initialized"); 
    } 

}