2016-12-27 55 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"); 
    } 

}