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