You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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或注解声明了MvcContext Bean,手动添加会触发CDI容器的重复Bean冲突。

内容的提问来源于stack exchange,提问作者mthmulders

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:37:15