JBoss 6.4.0中Jersey+EJB开发REST应用依赖注入空指针问题
解决Jersey + EJB在JBoss 6.4下的NullPointerException问题
看起来你遇到的核心问题是:Jersey默认会自行实例化REST控制器类,而不会交给EJB容器管理,导致@EJB注解无法触发依赖注入,最终出现空指针。下面是针对你的环境(JBoss 6.4.0 + Jersey 2.25.1)的具体解决方案:
1. 让REST控制器成为EJB管理的Bean
首先,需要把你的DocumentController标记为EJB,这样JBoss的EJB容器才会接管它的实例化和依赖注入:
@Path("message") @Stateless // 添加这个注解,让控制器成为无状态EJB public class DocumentController { @EJB private TestService testService; @GET public String greeting() { return testService.greeting(); } }
2. 添加Jersey与EJB/CDI集成的依赖
Jersey默认不支持EJB注入,需要添加专门的集成依赖。在你的Maven pom.xml中加入:
<dependency> <groupId>org.glassfish.jersey.ext.cdi</groupId> <artifactId>jersey-cdi1x</artifactId> <version>2.25.1</version> <scope>provided</scope> <!-- JBoss EAP 6.4已内置相关API,用provided避免冲突 --> </dependency>
3. 启用CDI支持(关键步骤)
JBoss的EJB注入依赖CDI容器,所以需要在你的Web应用中添加beans.xml文件(即使是空的)来激活CDI。在WEB-INF目录下创建该文件:
<?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_1_1.xsd" version="1.1" bean-discovery-mode="all"> </beans>
4. 调整Jersey的配置(二选一)
方式一:用Application类注册资源
创建一个Jersey的Application子类,明确注册你的控制器:
import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; import java.util.HashSet; import java.util.Set; @ApplicationPath("/api") // 定义REST接口的基础路径 public class JerseyAppConfig extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> resources = new HashSet<>(); resources.add(DocumentController.class); return resources; } }
方式二:修改web.xml配置
如果习惯用web.xml配置Jersey,添加以下参数让它识别EJB范围的Bean:
<servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>你的控制器所在包名</param-value> <!-- 替换成实际包路径 --> </init-param> <init-param> <param-name>jersey.config.server.provider.scope</param-name> <param-value>javax.ejb.Stateless</param-value> <!-- 告诉Jersey扫描无状态EJB --> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/api/*</url-pattern> </servlet-mapping>
5. 验证部署
完成以上配置后,重新部署应用到JBoss 6.4,访问http://你的服务器地址:端口/应用名/api/message,应该能正常返回Vazgen,不再出现NullPointerException。
内容的提问来源于stack exchange,提问作者Aram
相关产品推荐
相关产品推荐

