当部署在 JBoss EAP 上时,自动装配对象在 Rest 控制器中为空

Autowired object is null in Rest controller when deployed on JBoss EAP

我正在使用 SpringbootRESTEasy 在我的控制器中创建一个小型网络应用 class 我正在做 @Autowire 为我道 class。每当我部署代码时,dao 引用变量总是以 null 值结尾。我已经将 @Component 用于控制器和邮件应用程序 class 我已经使用 @SpringBootApplication 并且在我的 dao class 中我还添加了 @Repository@Service.

请给我一些建议,我到底哪里做错了?

注意:如果我 运行 它作为独立的 Springboot 应用程序工作正常。但是在 JBoss 服务器中部署时会出现此问题。

代码格式如下所示:调试时,在第 行,List<DataDto> dataList = dao.findData(); 总是 dao 是 null,因此 API 调用失败。

@Component
@Path("/")
public class apiController {

    @Autowired
    private ApiDao dao;

    public void setApiDao(ApiDao dao) {
        this.dao = dao;
    }

    @GET
    @Path("/getData")
    @Produces(MediaType.APPLICATION_JSON)
    public List<DataDto> getDetails(){
        List<DataDto> dataList = dao.findData();
        return logList;
    }
}

道class代码如下:

@Repository
@Service
public class ApiDao {

    private final Logger log = LoggerFactory.getLogger(ApiDao.class);

    private JdbcTemplate jdbcTemplate;

    @Autowired
    public ApiDao(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public List<SystemEntity> findData() throws SystemException{

        return entityList;
    }
}

对于配置,我使用了以下代码并在 pom.xml 中添加了所需的依赖项:

@Component
@ApplicationPath("/rest/")
public class JaxrsApplication extends Application {

}

问题

JBoss 为 RESTEasy 提供内置支持。所以在这种情况下 apiController 初始化两次 :

  1. 曾经 Spring
  2. 曾经 JBoss.

自动装配发生在由 spring 初始化的实例中,但是当触发对 apiController 的调用时,它由 JBoss 初始化的实例处理。

解决方案

禁止 JBoss 初始化 RESTEasy 控制器。在您的 spring 引导应用程序中,在 src/main/webapp/WEB-INF 下创建一个 web.xml 并添加以下上下文参数:

<context-param>
    <param-name>resteasy.scan</param-name>
    <param-value>false</param-value>
</context-param>
<context-param>
    <param-name>resteasy.scan.providers</param-name>
    <param-value>false</param-value>
</context-param>
<context-param>
    <param-name>resteasy.scan.resources</param-name>
    <param-value>false</param-value>
</context-param>