繁体   English   中英

重新加入与Java CDI Weld的对话

[英]Reattach to conversation with Java CDI Weld

我想加入现有的对话范围。

我开始对话:

conversation.begin(packageId);

我接近使用以下似乎有效的方法:

@Inject @Http CoversationContext context;

context.activate(packageId);

但是,我在日志中看到一条警告,提示我做错了。

警告:WELD-000335:对话上下文已经处于活动状态,很可能在先前的请求处理期间未正确清理它:HttpServletRequestImpl [POST / path / to / url]

我也很高兴有另一种方法来删除对话并重新创建(只要我可以继续使用相同的自定义对话ID),我试图避免用户多次重新加载页面,从而用重复的空间填充内存相同的包装数据。

我也考虑过使用@SessionScoped bean,但是我想如果可以将程序包ID设置为会话ID,那么就可以避免管理@SessionScoped bean了。

只要cid参数在请求中,并且对话是long-running (因为您已经conversation.begin(packageId) ),那么就不需要加入对话上下文,它已经在当前请求中处于活动状态。

但是,您需要做的是通过以下方式在每个请求形式或url参数中包含cid

例如

<h:link> <f:param name="cid" value="#{javax.enterprise.context.conversation.id}"/> </h:link>

要么

<h:form> <f:param name="cid" value="#{javax.enterprise.context.conversation.id}"/> /h:form>

请注意,对话必须通过将其显式启动为session.begin(id)才能长时间运行

也:

在步骤处理的最后,您需要显式调用conversation.end()否则仅在会话上下文结束时,将破坏对话范围的bean。

对于书签标记,那么您需要在路径中包括cid参数或任何逻辑映射,然后使用过滤器转发cid参数:

@WebFilter(urlPatterns = "/*")
public class CidFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        String cid = extractCidParameterIfAny(request);
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        if (cid != null) {
            String forwardUrl = buildForwardUrlWithCidParameter(cid);
            HttpServletRequest wrapper = new CidHttpServletRequest(httpRequest);
            httpRequest.getRequestDispatcher(forwardUrl).forward(wrapper, response);
        } else {
            chain.doFilter(request, response);
        }
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM