在 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>
这是最简单的解决方案,但我在第一次阅读Weld 文档时没有在该上下文参数名称和对话参数键或错误 WELD-000321 之间建立关联。
或以编程方式设置
我还能够从基于SO 示例的自定义 ServletContextListener.contextInitialized 方法以编程方式覆盖参数名称/上下文 ID 键,以摆脱 NonexistentConversationException。由于我使用的是 Tomcat 8.5(Servlet 3.1),因此我能够使用 @WebListener 或 web.xml 中的侦听器元素。我的 web.xml web-app 版本是旧的 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());
}
}