如何在tomcat 8.5/servlet 3.1上启动WELD 3.0 CID SETPARAMETERNAME



我正在尝试将旧的Web应用程序从JSF 2.1.1-FCS升级到Tomcat 8.5 Servlet 3.1容器中运行的2.2.14。

Mojarra JSF的最低要求(我猜最新版本,该页面似乎不清楚(说CDI 1.2在建议的2.0中需要。

我添加了CD-API-2.0和Weld-Servlet Shaded-3.0.0.-Final以及其他依赖性。事情似乎有效,直到我测试了我们已经使用了很长时间的一些URL。我们的应用程序一直在使用cid参数。焊缝使用相同的参数跟踪对话。结果,我们得到WELD-000321: No conversation found to restore for id错误。

我想尽早调用org.jboss.weld.context.http.HttpConversationContext.setParameterName(String cid)以修改此Web应用程序的值。

在Servlet 3.1容器上下文中更改此值的最佳方法是什么,例如Tomcat 8.5?

web.xml in Web.xml

initialize weld_context_id_key

使用web.xml上下文 - param weld_context_id_key允许我覆盖从CID到我选择的值的焊接CDI对话参数密钥名称,以便我可以在升级的应用程序中保留CID的传统用法,并避免使用WELD-000321错误。

<context-param>
    <param-name>WELD_CONTEXT_ID_KEY</param-name>
    <param-value>customValue</param-value>
</context-param>

这是最简单的解决方案,但是当第一次阅读焊接文档时,我没有在该上下文参数名称与对话参数键或错误weld-000321之间建立关联。

或编程设置

我还能够从自定义的ServletContextListener.contextinitializationed方法基于SO示例来覆盖参数名称/上下文ID密钥,以摆脱notxistentConversationException。由于我在Tomcat 8.5(Servlet 3.1(上,因此我能够在Web.xml中使用@weblistener或侦听器元素。我的Web.xml Web应用版本是否是旧的2.5,或者我将其更新为3.1。

似乎并不重要。
package ssce;
import java.util.UUID;
import javax.inject.Inject;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import org.jboss.weld.context.http.HttpConversationContext;
@WebListener
public class MyServletContextListener implements ServletContextListener {
    @Inject
    private HttpConversationContext conversationContext;
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        hideConversationScope();
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
    }

    /**
     * "Hide" conversation scope by replacing its default "cid" parameter name
     * by something unpredictable.
     */
    private void hideConversationScope() {
        conversationContext.setParameterName(UUID.randomUUID().toString());
    }
}

相关内容

  • 没有找到相关文章

最新更新