简体   繁体   English

Null 在实现 Runnable 的 class 中调用存储库时出现指针异常

[英]Null Pointer Exception when Calling repository in a class implementing Runnable

I have a project in which there is a use case where a user books a meeting lets suppose for 10am to 11 am with another user.我有一个项目,其中有一个用例,用户预订会议让我们假设上午 10 点到 11 点与另一个用户。 Now on the backend i want to check at 11 am if the meeting went well or not.现在在后端,我想在上午 11 点检查会议是否顺利。

For this i am using Scheduled Future and Runnable.为此,我使用 Scheduled Future 和 Runnable。 Whenever i book a meeting i create a scheduled future with the relevant meeting end time cron expression..which works fine but the problem is that i am not able to access repository or any of the services inside my run function which is necessary.每当我预订会议时,我都会使用相关的会议结束时间 cron 表达式创建一个预定的未来。它工作正常,但问题是我无法访问存储库或我运行的 function 中的任何服务,这是必要的。 i am getting a Null Pointer Exception我得到一个 Null 指针异常

Here is one of the meetingService Code which triggers using endpoint这是使用端点触发的会议服务代码之一

public String createMeetingSchedulerJobs(){
        BookingDetails booking = repBooking.findAll().get(0);

        //create completion check job
        String[] dateParts = booking.getDateOfMeeting().split("/");
        TaskDefinition taskDefinition = new TaskDefinition();
        taskDefinition.setData(booking.getMeetingId());
        taskDefinition.setActionType(TaskDefinitonType.MEETING_COMPLETION);
        taskDefinition.setCronExpression(miscUtils.generateCronExpression(parseInt(dateParts[0]),parseInt(dateParts[1]),booking.getEndTimeHour(),booking.getEndTimeMinute(),0));
        taskDefinitionBean.setTaskDefinition(taskDefinition);
        taskDefinitionBean.setMiscUtils(miscUtils);
        return taskSchedulerService.scheduleATask(taskDefinition);
    }

the relevant schedulerService code相关的 schedulerService 代码

 public String scheduleATask(TaskDefinition taskDefinition){
        String jobId = UUID.randomUUID().toString();
        taskDefinition.setId(jobId);
        TaskDefinitionBean taskDefinitionBean = new TaskDefinitionBean();
        taskDefinitionBean.setTaskDefinition(taskDefinition);
        Runnable tasklet = taskDefinitionBean;
        ScheduledFuture<?> scheduledTask = taskScheduler.schedule(tasklet, new CronTrigger(taskDefinition.getCronExpression(), TimeZone.getTimeZone(TimeZone.getDefault().getID())));
   
        jobsMap.put(jobId, scheduledTask);
        return jobsMap.toString();
    }

Example Service示例服务

@Service
public class MiscellaneousUtils {
    public String returnHello(){
        return "Hello there ~";
    }
}

TaskDefinitionBean.class任务定义Bean.class

@Configurable
@Service
public class TaskDefinitionBean implements Runnable{
    private TaskDefinition taskDefinition;

    private MiscellaneousUtils miscUtils;

    private BeanFactory beanFactory;

    @Override
    public void run() {
        miscUtils = beanFactory.getBean(MiscellaneousUtils.class);
    }

    public TaskDefinition getTaskDefinition(){
        return taskDefinition;
    }
    public void setTaskDefinition(TaskDefinition taskDefinition){
        this.taskDefinition=taskDefinition;
    }
    public void setMiscUtils(MiscellaneousUtils miscUtils){this.miscUtils=miscUtils;}
}

I have tried different types of dependency injection in TaskDefinitionBean.class but not successful.我在 TaskDefinitionBean.class 中尝试了不同类型的依赖注入,但没有成功。 I know there are many relevant and insightful questions which were similar but still couldn't use the approach.我知道有许多相关且有见地的问题是相似的,但仍然无法使用该方法。

The Error which i am getting is:我得到的错误是:

java.lang.NullPointerException: null
    at fG.Service.TaskDefinitionBean.run(TaskDefinitionBean.java:38) ~[classes/:na]
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93) [spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:514) [na:na]
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) [na:na]
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:299) [na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) [na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) [na:na]
    at java.base/java.lang.Thread.run(Thread.java:844) [na:na]

for dependency injection to work Your bean has to be created by spring, You create it manually依赖注入工作你的bean必须由spring创建,你手动创建它

TaskDefinitionBean taskDefinitionBean = new TaskDefinitionBean();

so beanFactory is null所以beanFactorynull

You can Autowire beanFactory in Service and pass it to TaskDefinitionBean您可以在 Service 中自动装配beanFactory并将其传递给TaskDefinitionBean

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM