WildFly部署EJB遇WFLYEJB0406错误求助
一、WildFly 27.0.1 中的 WFLYEJB0406 错误
问题根源
直接注入泛型接口 IGenericDAO 时,EJB容器无法关联到具体的@Stateless实现类ClienteDAO——容器需要明确的、非泛型的接口或直接绑定标注了EJB注解的实现类。
解决方法
直接注入具体实现类
在ClienteController中将注入类型改为ClienteDAO:@EJB private ClienteDAO clienteDAO;容器可直接识别标注了
@Stateless的ClienteDAO实例。为泛型接口定义具体子接口(保留泛型注入场景)
先定义继承自IGenericDAO的具体子接口,再让ClienteDAO实现该接口:public interface IClienteDAO extends IGenericDAO<Cliente> {} @Stateless public class ClienteDAO extends GenericDAO<Cliente> implements IClienteDAO {}随后在Servlet中注入
IClienteDAO:@EJB private IClienteDAO clienteDAO;容器即可识别对应的EJB实现。
校验beans.xml位置
Web应用中beans.xml需放在WEB-INF目录下,EJB模块放在META-INF目录,位置错误会导致CDI/EJB扫描失效。
二、WildFly 24.0.0 中的 NoClassDefFoundError: jakarta/servlet/http/HttpServlet
问题根源
WildFly 24基于Jakarta EE 9,所有EE API包名从javax.*迁移至jakarta.*。若项目依赖了javax.servlet-api,或servlet依赖的scope未设为provided,会与WildFly自带的Jakarta Servlet API冲突,引发类找不到的错误。
解决方法
调整Servlet API依赖的scope
在Maven的pom.xml中,将servlet依赖设置为provided(WildFly已内置Jakarta Servlet实现),并使用Jakarta版本的依赖:<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency>若之前用的是
javax.servlet:javax.servlet-api,需替换为上述Jakarta版本依赖。对齐项目Jakarta EE版本
确保项目中所有EE相关依赖(EJB、CDI等)均使用Jakarta EE 9对应版本,避免javax与jakarta包混用。清理重构项目
删除本地Maven仓库中冲突的依赖,执行mvn clean install重新构建后,再部署到WildFly 24。
内容的提问来源于stack exchange,提问作者Lucas Atolini

