无法在组件中注入 bean [英] Not able inject bean in the component

查看:37
本文介绍了无法在组件中注入 bean的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经使用 这个链接我有一个简单的 MyJobTwo.java 组件,它有一个使用 CronTriggerFactoryBean 调用的方法 executeInternal().

I have implemented Spring Quartz scheduler example using this link I am having simple MyJobTwo.java component that has a method executeInternal() that is being called using CronTriggerFactoryBean.

这是我的QuartzConfiguration.java

@Configuration 
@ComponentScan("com.example") 
public class QuartzConfiguration {
    // we need to create a bean that will excuted by MethodInvokingJobDetailFactoryBean
    // in this case we have myJobOne is the simple bean

    @Bean
    public MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean() {
        MethodInvokingJobDetailFactoryBean obj = new MethodInvokingJobDetailFactoryBean();
        obj.setTargetBeanName("myJobOne");
        obj.setTargetMethod("myTask");
        return obj;
    }

    // This trigger will schedule the job after 3 seconds and repeat after every 30 seconds for 3+1 times.
    @Bean
    public SimpleTriggerFactoryBean simpleTriggerFactoryBean(){
        SimpleTriggerFactoryBean stFactory = new SimpleTriggerFactoryBean();
       stFactory.setJobDetail(methodInvokingJobDetailFactoryBean().getObject());
        stFactory.setStartDelay(3000);
        stFactory.setRepeatInterval(30000);
        stFactory.setRepeatCount(1);
        return stFactory;
    }

    // We use it to configure complex job such as job scheduling using cron-expression
    @Bean
    public JobDetailFactoryBean jobDetailFactoryBean(){
        JobDetailFactoryBean factory = new JobDetailFactoryBean();
        factory.setJobClass(MyJobTwo.class);
        // Map<String,Object> map = new HashMap<String,Object>();
        // map.put("myJobOne", myJobOne);
        // map.put(MyJobTwo.myJodOne, 1);
        //factory.setJobDataAsMap(map);
        //factory.setGroup("mygroup");
        //factory.setName("myjob");
        return factory;
    }

    // CronTriggerFactoryBean configures JobDetailFactoryBean
    // We also configure start delay, trigger name, and cron-expression to schedule the job

    @Bean
    public CronTriggerFactoryBean cronTriggerFactoryBean(){
        CronTriggerFactoryBean stFactory = new CronTriggerFactoryBean();
        stFactory.setJobDetail(jobDetailFactoryBean().getObject());
        stFactory.setStartDelay(3000);
        //stFactory.setName("mytrigger");
        //stFactory.setGroup("mygroup");
        stFactory.setCronExpression("0 0/1 * 1/1 * ? *");
        return stFactory;
    }

    // SchedulerFactoryBean use to register the triggers 
    // those registered triggers will be executed
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() {
        SchedulerFactoryBean scheduler = new SchedulerFactoryBean();
        scheduler.setTriggers(cronTriggerFactoryBean().getObject());
        //scheduler.setTriggers(simpleTriggerFactoryBean().getObject());
        return scheduler;
    }
}

这是我使用 CronTriggerFactoryBean 执行的 bean.

This is the bean that I am executing using CronTriggerFactoryBean.

MyJobTwo.java

@Component
public class MyJobTwo extends QuartzJobBean {

    private SmtpMailSender smtpMailSender;

    @Autowired
    public MyJobTwo(MyJobOne myJobOne, SmtpMailSender smtpMailSender) {
        super();
        this.myJobOne = myJobOne;
        this.smtpMailSender = smtpMailSender;
    }

    @Override
    protected void executeInternal(JobExecutionContext ctx)
            throws JobExecutionException {
        System.out.println("this is the test");
        myJobOne.myTask();
        System.out.println("task is done");
    }

}

每当我尝试注入其他 bean 和服务时,我都会收到这些错误.任何人都知道是什么导致了这些错误,我需要进行哪些更改?

Whenever I am trying to inject other beans and service I am getting these errors. Anyone having any idea what is causing these errors, what changes do I need to make?

org.quartz.SchedulerException: Job instantiation failed
    at org.springframework.scheduling.quartz.AdaptableJobFactory.newJob(AdaptableJobFactory.java:45)
    at org.quartz.core.JobRunShell.initialize(JobRunShell.java:127)
    at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:375)
Caused by: java.lang.InstantiationException: com.example.job.MyJobTwo
    at java.lang.Class.newInstance(Class.java:427)
    at org.springframework.scheduling.quartz.AdaptableJobFactory.createJobInstance(AdaptableJobFactory.java:58)
    at org.springframework.scheduling.quartz.AdaptableJobFactory.newJob(AdaptableJobFactory.java:41)
    ... 2 common frames omitted
Caused by: java.lang.NoSuchMethodException: com.example.job.MyJobTwo.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.newInstance(Class.java:412)
    ... 4 common frames omitted

推荐答案

默认作业工厂实现 AdaptableJobFactory 没有自动装配功能.
要使用依赖注入,请执行以下操作:

The default job factory implementation AdaptableJobFactory doesn't have autowiring capability.
To use dependency injection do following:

1.创建作业工厂

package com.concretepage.config;

import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;

public class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {
    private transient AutowireCapableBeanFactory beanFactory;

    public void setApplicationContext(final ApplicationContext context) {
        beanFactory = context.getAutowireCapableBeanFactory();
    }

    @Override
    public Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
        final Object job = super.createJobInstance(bundle);
        beanFactory.autowireBean(job);  //the magic is done here
        return job;
    }
}

http://codrspace.com/Khovansa/spring 上找到实施-quartz-with-a-database/

2.更新 QuartzConfiguration 中的 schedulerFactoryBean 声明:

2.Update schedulerFactoryBean declaration in QuartzConfiguration:

@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
    SchedulerFactoryBean scheduler = new SchedulerFactoryBean();
    scheduler.setTriggers(simpleTriggerFactoryBean().getObject(), cronTriggerFactoryBean().getObject());
    scheduler.setJobFactory(jobFactory());
    return scheduler;
}

@Bean
public JobFactory jobFactory() {
    return new AutowiringSpringBeanJobFactory();
}

  1. 使用基于 setter 的注入代替构造函数注入

这篇关于无法在组件中注入 bean的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆