使用@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
相关产品推荐
相关产品推荐

