Spring Boot, Autowired 在 ServletContextListener.contextInitialized 中为 null
Spring Boot, Autowired is null in ServletContextListener.contextInitialized
我在 contextInitialized 中通过自动装配得到一个 NullPointerException,也许有人可以帮助我,非常感谢。
主要class
@SpringBootApplication
@CompnentScan
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
@Bean
public ProfileAdminListener profileAdminListener() {
return new ProfileAdminListener();
}
}
ServletContextListener
@WebListener()
public class ProfileAdminListener implements ServletContextListener {
private final Timer timer = new Timer();
public ProfileAdminListener() {
setProperties();
}
private void setProperties() {
....
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
timer.cancel();
timer.purge();
}
@Override
public void contextInitialized(ServletContextEvent sce) {
startProtokollTask();
}
private void startProtokollTask() {
ProtokollFileWriteTask task = ProtokollFileWriteTask.getInstance();
timer.schedule(task, 0, 10000);
}
}
任务
@Component
public class ProtokollFileWriteTask extends TimerTask {
private static ProtokollFileWriteTask instance = new ProtokollFileWriteTask();
@Autowired
private ProtokollService protokollService;
private ProtokollFileWriteTask() {
}
public static ProtokollFileWriteTask getInstance() {
return instance;
}
@Override
public void run() {
writeFile();
}
private void writeFile() {
protokollService.writeProtokollFile("c:\temp"); <---- prtokollService is null
}
}
启动应用程序后,我想启动时间任务,但我得到一个 NullPointerException,因为 protokollservice 是空的。我认为该服务在使用之前未初始化。
通过使用正常的 spring mvc xml 配置,这没有问题。如何通过 Spring 引导配置它?谢谢。
Kryger的回答是对的,这个问题是因为我新建了一个timetask,这个不受spring控制。非常感谢。
您可以使用静态方法创建新 bean,例如:
@Component
public class ProtokollFileWriterTaskCreator {
@Autowired
ProtokollFileWriteTask bean;
public ProtokollFileWriteTask create() {
return bean;
}
}
在另一边,修改你的另一个bean :
@Component
public class ProtokollFileWriteTask extends TimerTask {
@Autowired
private ProtokolService protokollService;
@Override
public void run() {
writeFile();
}
private void writeFile() {
protokollService.writeProtokollFile("c:\temp");
}
}
在 weblistener class 中,您应该使用 creator bean:
@WebListener
public class ProfileAdminListener implements ServletContextListener {
private final Timer timer = new Timer();
@Autowired
ProtokollFileWriterTaskCreator timerTaskFactory;
public ProfileAdminListener() {
setProperties();
}
private void setProperties() {
//nothing
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
timer.cancel();
timer.purge();
}
@Override
public void contextInitialized(ServletContextEvent sce) {
startProtokollTask();
}
private void startProtokollTask() {
timer.schedule(timerTaskFactory.create(), 0, 10000);
}
}
问题是您使用运算符 new 来创建 bean
这与符号 @Autowire
不兼容
抱歉我的英语不好
我在 contextInitialized 中通过自动装配得到一个 NullPointerException,也许有人可以帮助我,非常感谢。
主要class
@SpringBootApplication
@CompnentScan
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
@Bean
public ProfileAdminListener profileAdminListener() {
return new ProfileAdminListener();
}
}
ServletContextListener
@WebListener()
public class ProfileAdminListener implements ServletContextListener {
private final Timer timer = new Timer();
public ProfileAdminListener() {
setProperties();
}
private void setProperties() {
....
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
timer.cancel();
timer.purge();
}
@Override
public void contextInitialized(ServletContextEvent sce) {
startProtokollTask();
}
private void startProtokollTask() {
ProtokollFileWriteTask task = ProtokollFileWriteTask.getInstance();
timer.schedule(task, 0, 10000);
}
}
任务
@Component
public class ProtokollFileWriteTask extends TimerTask {
private static ProtokollFileWriteTask instance = new ProtokollFileWriteTask();
@Autowired
private ProtokollService protokollService;
private ProtokollFileWriteTask() {
}
public static ProtokollFileWriteTask getInstance() {
return instance;
}
@Override
public void run() {
writeFile();
}
private void writeFile() {
protokollService.writeProtokollFile("c:\temp"); <---- prtokollService is null
}
}
启动应用程序后,我想启动时间任务,但我得到一个 NullPointerException,因为 protokollservice 是空的。我认为该服务在使用之前未初始化。
通过使用正常的 spring mvc xml 配置,这没有问题。如何通过 Spring 引导配置它?谢谢。
Kryger的回答是对的,这个问题是因为我新建了一个timetask,这个不受spring控制。非常感谢。
您可以使用静态方法创建新 bean,例如:
@Component
public class ProtokollFileWriterTaskCreator {
@Autowired
ProtokollFileWriteTask bean;
public ProtokollFileWriteTask create() {
return bean;
}
}
在另一边,修改你的另一个bean :
@Component
public class ProtokollFileWriteTask extends TimerTask {
@Autowired
private ProtokolService protokollService;
@Override
public void run() {
writeFile();
}
private void writeFile() {
protokollService.writeProtokollFile("c:\temp");
}
}
在 weblistener class 中,您应该使用 creator bean:
@WebListener
public class ProfileAdminListener implements ServletContextListener {
private final Timer timer = new Timer();
@Autowired
ProtokollFileWriterTaskCreator timerTaskFactory;
public ProfileAdminListener() {
setProperties();
}
private void setProperties() {
//nothing
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
timer.cancel();
timer.purge();
}
@Override
public void contextInitialized(ServletContextEvent sce) {
startProtokollTask();
}
private void startProtokollTask() {
timer.schedule(timerTaskFactory.create(), 0, 10000);
}
}
问题是您使用运算符 new 来创建 bean 这与符号 @Autowire
不兼容抱歉我的英语不好