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

使用@EJB注解查找无状态Bean失败问题求助

解决WildFly 10中@EJB注入NullPointerException的问题

你遇到的核心问题是**@EJB注解里的lookup名称不匹配实际的JNDI绑定**,再加上可能忽略了容器管理类的要求,导致注入失败。下面一步步帮你排查和解决:

1. 修正@EJB的lookup值

你当前用的lookup = "javaee/T1ServiceImpl"根本不在给出的JNDI绑定列表里。WildFly生成的JNDI名有固定前缀和格式,你需要从提供的绑定里选一个合适的:

  • 如果控制器和Bean在同一个模块里,用最简洁的:
    @EJB(lookup = "java:module/T1ServiceImpl!p1.T1Service")
    private T1Service t1Service;
    
  • 如果是同一个应用(EAR内不同模块),用:
    @EJB(lookup = "java:app/javaee/T1ServiceImpl!p1.T1Service")
    
  • 全局范围的话用:
    @EJB(lookup = "java:global/javaee/T1ServiceImpl!p1.T1Service")
    
    注意:必须带上接口的全限定名!p1.T1Service,除非你用不带接口的绑定(比如java:global/javaee/T1ServiceImpl),但更推荐带接口的写法,避免歧义。

2. 确保你的控制器是容器管理的类

如果你的控制器是普通Java类(没有加任何容器管理注解,比如@Named、@WebServlet、@ManagedBean或者@ApplicationScoped等CDI注解),WildFly的EE容器根本不会处理它的@EJB注入,自然t1Service会是null。

举个例子:如果是JSF控制器,要加@Named和@RequestScoped;如果是Servlet,要继承HttpServlet并配置@WebServlet注解。只有被容器托管的类,注入逻辑才会生效。

3. 验证Bean的包结构与JNDI匹配

确认你的T1Service接口的全限定名确实是p1.T1Service,和JNDI绑定里的!p1.T1Service部分完全一致。如果包名写错,即使lookup路径正确,也找不到目标Bean。

额外优化:不用lookup实现自动注入

因为你的Bean有@Local接口,其实可以不用指定lookup属性,让容器自动根据类型匹配注入,写法更简洁:

@EJB
private T1Service t1Service;

只要控制器和Bean在同一个EE模块/应用里,容器会自动找到对应的Local Bean实现,省去手动编写JNDI名的麻烦。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:26:36