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

时间:2017-07-26 17:12:26

标签: spring spring-boot jboss resteasy

我正在使用 Springboot RESTEasy 来创建一个小型的webapp,在我的Controller类中,我正在为我的Dao类做@Autowire。每当我部署代码时,dao引用变量总是以null值结束。我使用@Component用于控制器和邮件应用程序类我使用了@SpringBootApplication,在我的dao类中我也添加了@Repository@Service

请提供一些建议我到底做错了什么?

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

代码格式如下所示:在调试时,List<DataDto> dataList = dao.findData();始终为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;
    }
}

Dao类代码如下:

@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 {

}

1 个答案:

答案 0 :(得分:0)

问题

JBoss为RESTEasy提供内置支持。因此,在这种情况下,apiController 初始化两次

  1. 一次是春天
  2. 一次是JBoss。
  3. 自动装配发生在由spring初始化的实例中,但当调用被apiController触发时,它由JBoss初始化的实例处理。

    解决方案

    禁止JBoss初始化RESTEasy控制器。在春季启动应用程序中,在web.xml下创建src/main/webapp/WEB-INF并添加以下上下文参数:

    <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>