【问题标题】:How to init Weld 3.0 cid setParameterName on Tomcat 8.5/Servlet 3.1如何在 Tomcat 8.5/Servlet 3.1 上初始化 Weld 3.0 cid setParameterName
【发布时间】:2019-10-04 04:35:42
【问题描述】:

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

Mojarra JSF 最低要求(我猜是最新版本,该页面似乎不太清楚)除其他外指出,需要 CDI 1.2,建议使用 2.0。

我添加了 cd-api-2.0 和weld-servlet-shaded-3.0.0.Final 以及其他依赖项。在我测试一些我们已经使用了很长时间的 URL 之前,一切似乎都有效。我们的应用程序一直在使用cid 参数。 Weld 使用相同的参数来跟踪对话。结果我们得到了WELD-000321: No conversation found to restore for id 错误。

我想尽早致电org.jboss.weld.context.http.HttpConversationContext.setParameterName(String cid) 来修改此网络应用程序的值。

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

【问题讨论】:

  • 您是否从源代码中“手动”调用该方法?您是否迁移到 CDI 注释?
  • 可以配置焊接参数iirc
  • @Selaron,我确实尝试注入一个 HttpConversationContext 以从几个不同的地方调用 setParameterName ,类似于此答案中显示的内容:stackoverflow.com/a/26744986/101151,但似乎没有得到注入。我不确定什么时候是合适的时机。在 servlet 中似乎为时已晚。
  • @Kukeltje 我回去再次根据您的建议查找参数。看起来它是 WELD_CONTEXT_ID_KEY。效果很好,谢谢!我不知道我是否错过了它,因为我太努力寻找 org.jboss.weld... 或者是因为他们在环境中描述它的方式与我的用例和错误不匹配。错误报告 WELD-1697 确实如此。
  • 酷,如果您在 stackoverflow 中找不到重复项,请创建一个答案。

标签: cdi jsf-2.2 tomcat8.5 servlet-3.1


【解决方案1】:

在 web.xml 中初始化 WELD_CONTEXT_ID_KEY

使用 web.xml 上下文参数 WELD_CONTEXT_ID_KEY 允许我将 Weld CDI 对话参数键名称从 cid 覆盖为我选择的值,因此我可以在升级的应用程序中保留 cid 的旧用法并避免 WELD-000321错误。

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

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

或以编程方式设置

我还能够通过基于SO example for getting rid of the NonexistentConversationException 的自定义 ServletContextListener.contextInitialized 方法以编程方式覆盖参数名称/上下文 ID 键。由于我使用的是 Tomcat 8.5(Servlet 3.1),因此我能够使用 @WebListener 或 web.xml 中的侦听器元素。我的 web.xml 网络应用程序版本是旧的 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());
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    相关资源
    最近更新 更多