当我从@Startup @Singleton bean的@Schedule调用方法时出现NullPointerException

问题描述 投票:0回答:1

当我尝试从 @Startup @Singleton bean 调用 @ViewScoped Bean 的方法时,我总是遇到错误 NullPointerException。我使用@Schedule注解方法调用@ViewScoped bean方法,为什么会出现这种情况?

我的时间豆:

package lv.vda.luis_web.messager.boundary;

import javax.ejb.AccessTimeout;
import javax.ejb.Schedule;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.inject.Inject;
import java.io.Serializable;

@Startup
@Singleton
public class TimerBean implements Serializable {

    @Inject
    private TestBean testBean;


    @Schedule(hour = "*", minute = "*", second = "*/20", info = "")
    @AccessTimeout(value = 50000)
    private void timer() {

        testBean.test();

    }
}

我的测试豆:

package lv.vda.luis_web.messager.boundary;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import java.io.Serializable;


@Named
@ViewScoped
public class TestBean implements Serializable {


    public void test() {

        System.out.println("Checking is ok");

    }

}

错误日志:

14:46:40,008 错误 [org.jboss.as.ejb3.timer](EJB 默认值 - 3)WFLYEJB0020:调用计时器超时时出错:[id=90f8d796-c627-4e49-99a1-51af55c10c94 timedObjectId=luis_web.luis_web。 TimerBean 自动定时器?:true 持久性?:truetimerService=org.jboss.as.ejb3.timerservice.TimerServiceImpl@6e86bb33 previousRun=Thu Sep 12 14:36:00 EEST 2024initialExpiration=null IntervalDuration(以毫秒为单位)=0 nextExpiration =2024 年 9 月 12 日星期四 14:47:00 EEST 2024timerState=IN_TIMEOUT info=] ScheduleExpression [秒=/20;分钟=;小时=;某月=;月=;某周=;年=*;timezoneID = null;开始= null;结束= null]:javax.ejb.EJBException:java.lang.NullPointerException

jsf nullpointerexception singleton startup schedule
1个回答
0
投票

@ViewScoped 必须链接到视图。视图是向用户显示的东西。通常是从特定的 .xhtml 生成的内容。 在这种情况下,没有视图,因为它是按计划执行的深层后端 bean。所以没有视图,没有视图作用域,没有视图作用域 bean。 这是正确的行为。 您可能希望在应用程序、依赖或请求作用域中创建一个通用 bean,并将其注入到计划 bean 以及视图作用域 bean 中。 因此,这个通用 bean 将具有后端和前端所需的所有通用逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.