spring injection java.lang.NullPointerException

时间:2013-07-08 08:31:12

标签: spring jsf

当我注入了AdminService时,出现了java.lang.NullPointerException,虽然我在另一个托管bean中以相同的方式注入了这个bean并且一切正常:

    @ManagedBean
    @SessionScoped
    public class ScheduleController implements Serializable {

        /**
         * 
         */
        private static final long serialVersionUID = -1489523494215832724L;

        private ScheduleModel eventModel;

        @ManagedProperty(value = "#{adminService}")
        AdminService adminService;

        private ScheduleEvent event = new DefaultScheduleEvent();

        public ScheduleController() {
            List<Service> = adminService.getAllService();

        }

    public AdminService getAdminService() {
        return adminService;
    }


    public void setAdminService(AdminService adminService) {
        this.adminService = adminService;
    }

AdminService实施:

Service("adminService")
public class AdminServiceImpl implements AdminService,Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Autowired
    AdminDao adminDao ;
    // adminDao injected by spring 

    @Transactional
    public void add(Admin admin) {
        adminDao.save(admin);

    }

    @Transactional
    public void edit(Admin admin) {
        adminDao.update(admin);

    }

    @Transactional
    public void delete(Admin admin) {
        adminDao.delete(admin);

    }

    @Transactional
    public Admin getAdmin(Integer adminId) {
        return adminDao.findById(adminId);
    }

    @Transactional
    public List<Admin> getAllAdmin() {
        return adminDao.findAll();
    }

    /**
     * @return the adminDao
     */
    public AdminDao getAdminDao() {
        return adminDao;
    }

    /**
     * @param adminDao the adminDao to set
     */
    public void setAdminDao(AdminDao adminDao) {
        this.adminDao = adminDao;
    }

    @Override
    public Admin authenticate(String adminName, String adminPass) {

        return this.adminDao.authenticate(adminName, adminPass);
    }



}

2 个答案:

答案 0 :(得分:0)

我找到了解决方案,问题不在于注入问题是一个调用问题,我用这种方式工作,并且它有效:

在托管bean中

我添加了一个init方法:

public void init(){ 
 List<Service> = adminService.getAllService();
}

并在page.xhtml中:

<f:metadata>
            <f:event type="preRenderView" listener="#{scheduleController.init()}"/>
</f:metadata>

答案 1 :(得分:0)

您正在尝试访问构造bean期间注入的依赖项。这显然不会起作用。你基本上期待这一切都如下所示:

ScheduleController scheduleController; // Declare.
scheduleController.adminService = new AdminService(); // Inject.
scheduleController = new ScheduleController(); // Construct.

这没有任何意义。在构造实例之前,无法设置实例变量。相反,它的工作原理如下:

ScheduleController scheduleController; // Declare.
scheduleController = new ScheduleController(); // Construct.
scheduleController.adminService = new AdminService(); // Inject.

如果您想在构建注入后直接执行操作,那么您应该使用@PostConstruct带注释的方法。

所以,替换

public ScheduleController() {
    List<Service> services = adminService.getAllService();

}

通过

@PostConstruct
public void init() { // Note: method name is fully free to your choice.
    List<Service> services = adminService.getAllService();

}

不需要<f:event>混乱。顺便说一句,它也不一定需要进入<f:metadata>