WELD-001408:禁用CDI隐式Bean扫描的OpenLiberty依赖不满足问题
问题分析与解决:禁用CDI隐式扫描后MvcContext注入失败
问题原因
禁用CDI隐式Bean扫描后,OpenLiberty的CDI容器仅识别显式声明的Bean(包括带CDI注解的类、beans.xml中指定的类)。而Jakarta MVC实现Krazo提供的MvcContext是内置Bean,默认依赖隐式扫描被CDI容器发现。关闭隐式扫描后,这个Bean未被注册,导致MVC Toolbox的DefaultTranslationResolverFactory因找不到依赖启动失败。
解决办法
方法1:通过beans.xml精准配置扫描范围
在Web模块下创建/修改WEB-INF/beans.xml,用<scan>标签指定扫描包,平衡启动速度与功能完整性:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd" version="2.0" bean-discovery-mode="annotated"> <scan> <!-- 包含Krazo核心包,确保MvcContext被扫描到 --> <include name="org.eclipse.krazo.*"/> <!-- 包含MVC Toolbox核心包 --> <include name="de.chkal.mvctoolbox.*"/> <!-- 包含你的应用业务包 --> <include name="com.yourcompany.polly.*"/> <!-- 按需排除不需要扫描的包,优化启动速度 --> <exclude name="com.yourcompany.polly.unused.*"/> </scan> </beans>
bean-discovery-mode="annotated"表示仅扫描带CDI注解的类,结合include/exclude精准控制扫描范围。
方法2:在OpenLiberty服务器配置中针对应用开启隐式扫描
若不想修改应用代码,可在server.xml中为目标Web应用单独开启隐式扫描,不影响其他应用:
<webApplication id="polly" location="polly.war" name="polly"> <cdi enableImplicitBeanDiscovery="true"/> </webApplication>
方法3:手动注册MvcContext Bean(不推荐)
该方法依赖Krazo内部实现,版本升级可能失效,仅作为备选:
import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Produces; import org.eclipse.krazo.core.MvcContext; import javax.servlet.ServletContext; import javax.inject.Inject; @ApplicationScoped public class MvcContextProducer { @Inject private ServletContext servletContext; @Produces public MvcContext produceMvcContext() { return servletContext.getAttribute(MvcContext.class.getName()); } }
为何之前的尝试无效
- 给方法参数加
@Named("mvc")无效:Krazo的MvcContext默认未绑定该名称,CDI容器无法匹配到对应Bean。 - 给Krazo加beans.xml导致重复定义:Krazo核心jar包已通过内置
beans.xml或注解声明了MvcContextBean,手动添加会触发CDI容器的重复Bean冲突。
内容的提问来源于stack exchange,提问作者mthmulders
相关产品推荐
相关产品推荐

