当部署在 JBoss EAP 上时,自动装配对象在 Rest 控制器中为空
Autowired object is null in Rest controller when deployed on JBoss EAP
我正在使用 Springboot 和 RESTEasy 在我的控制器中创建一个小型网络应用 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
被 初始化两次 :
- 曾经 Spring
- 曾经 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>
我正在使用 Springboot 和 RESTEasy 在我的控制器中创建一个小型网络应用 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
被 初始化两次 :
- 曾经 Spring
- 曾经 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>