首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NullPointerException at TaskScheduler

NullPointerException at TaskScheduler
EN

Stack Overflow用户
提问于 2017-01-20 02:54:02
回答 2查看 1.6K关注 0票数 2

我有一个TaskScheduler类如下:

代码语言:javascript
复制
public class NotificationManger {

@Autowired
private TaskScheduler scheduler;

private ScheduledFuture<?> sc;

public NotificationManger(WebSocketMessage webSocketMessage, String userName, Date date, Date time) {
    scheduleTask(webSocketMessage, userName, combine(date,time));
}

public void scheduleTask(WebSocketMessage webSocketMessage, String userName, Date startTime) 
  { 
    Runnable r = new NotificationSenderTask(webSocketMessage, userName);

    sc = scheduler.schedule(r, new Date());//here I get a  NullPointerException 

   }
}

可运行类如下所示:

代码语言:javascript
复制
class NotificationSenderTask implements Runnable {

@Autowired
SimpMessagingTemplate webSocketMessageTemplate;

private String userName;

private WebSocketMessage webSocketMessage;

public NotificationSenderTask(WebSocketMessage webSocketMessage, String userName) {
    this.webSocketMessage = webSocketMessage;
    this.userName = userName;
}

public void run() {

    webSocketMessageTemplate.convertAndSendToUser(userName, "/notification", webSocketMessage);;
}

}

我叫TaskSchedulerNotificationManger mn = new NotificationManger(new WebSocketMessage(n), user.getEmail(),date1,date2 );

但我在sc = scheduler.schedule(r, new Date());拿到了一份sc = scheduler.schedule(r, new Date());

也许我把这门课用错了。

任何帮助都将不胜感激,谢谢。

编辑:

代码语言:javascript
复制
@EnableWebMvc
@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true)
@Configuration
@ComponentScan(basePackages = "gestionprojet.java")
@PropertySource("classpath:application.properties")
@Import({PersistenceJPAConfig.class, WebSecurityConfig.class})
public class WebConfig extends WebMvcConfigurerAdapter {...}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-20 03:31:52

AutowireHelper到救援

实际上,OP没有重构所有代码,而是找到了一个库来强制自动绑定到一个非spring管理的bean中:

图书馆是:https://github.com/alv-ch/alv-ch-java

它可以这样使用:

代码语言:javascript
复制
public class NotificationManager {
    @Autowired
    private TaskScheduler scheduler;

    public NotificationManager(WebSocketMessage webSocketMessage, String userName, Date date, Date time) {
        AutowireHelper.autowire(this, scheduler);
        scheduleTask(webSocketMessage, userName, combine(date,time));
    }
    ...
}

这将使TaskScheduler自动进入NotificationManager,即使它不是由spring管理的。您可以看到AutowireHelper源代码这里

另一种可能的解决办法

1.用@Service注释NotificationManager并删除构造函数:

代码语言:javascript
复制
@Service
public class NotificationManager {

    @Autowired
    private TaskScheduler scheduler;

    private ScheduledFuture<?> sc;

    public void scheduleTask(WebSocketMessage webSocketMessage, String userName, Date date, Date time) {
        scheduleTask(webSocketMessage, userName, combine(date,time));
    }

    public void scheduleTask(WebSocketMessage webSocketMessage, String userName, Date startTime) 
    { 
        Runnable r = new NotificationSenderTask(webSocketMessage, userName);
        sc = scheduler.schedule(r, new Date());

   }
}

2. Autowire

然后,在您以前执行NotificationManager mn = new NotificationManager(...)的位置,执行以下操作:

代码语言:javascript
复制
@Autowired 
private NotificationManager notificationManager;

...
notificationManager.scheduleTask(new WebSocketMessage(n), user.getEmail(),date1,date2);

为了让它工作,无论它在哪里,它还需要在一个spring管理的bean中。

票数 2
EN

Stack Overflow用户

发布于 2017-01-20 03:23:22

您尚未初始化全局实例变量。

专用TaskScheduler调度器;

因为它是一个全局实例变量,所以它不会给出任何编译时错误,并且它被隐式地用空值初始化。

这就是为什么当您尝试访问scheduler.schedule时,它会抛出空指针错误。

希望这能解决您的查询。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41755309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档