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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:49:41