【问题标题】:spring injection java.lang.NullPointerException春季注入 java.lang.NullPointerException
【发布时间】:2013-07-08 08:31:12
【问题描述】:

当我注入了 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);
    }



}

【问题讨论】:

  • 你能把bean的配置贴出来吗?
  • 我发布了 AdminService 实现
  • 我建议您为该服务提供一个访问它的应用程序 bean(您可以通过代码直接加载它以使用注释的顺序)并将该 bean 注入您视图的每个 bean 中,以能够随时随地访问服务。

标签: spring jsf


【解决方案1】:

您正在尝试访问注入的依赖项 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();

}

不需要&lt;f:event&gt; 混乱。顺便说一句,它也不一定需要进入&lt;f:metadata&gt;

【讨论】:

    【解决方案2】:

    我找到了解决方案,问题不是注入问题,而是调用问题,我用这种方式工作,它有效:

    在托管 bean 中我添加了一个 init 方法:

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

    在 page.xhtml 中:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-03
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      • 1970-01-01
      • 2020-09-02
      • 2017-12-13
      相关资源
      最近更新 更多