大家好,又见面了,我是你们的朋友全栈君。
今天在做Spring Quarter动态设置触发时间时,需要在Service中注入org.springframework.scheduling.quartz.SchedulerFactoryBean使用下面的代码可用:
localQuartzScheduler通过注解注入
@Resource
private SchedulerFactoryBean localQuartzScheduler
Java代码
- Scheduler scheduler = localQuartzScheduler.getScheduler();localQuartzScheduler需要注入
- String[] strArr = systemConfig.getConfigValue().split(“-“);
- String day = strArr[2], month = strArr[1];
- String cronExpression = “0 0 2 “ day ” “ month ” ?”;
- try {
- CronTriggerBean trigger = (CronTriggerBean) scheduler.getTrigger(“cronTrigger”,
- Scheduler.DEFAULT_GROUP);
- trigger.setCronExpression(cronExpression);
- scheduler.rescheduleJob(“jsjYearCronTrigger”, Scheduler.DEFAULT_GROUP, trigger);
- } catch (Exception e) {
- logger.error(“重新设置年度任务执行日期失败”, e);
- }
启动tomcat报以下错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘addJob’ defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type [org.quartz.impl.StdScheduler] to required type [org.springframework.scheduling.quartz.SchedulerFactoryBean] for property ‘scheduler’; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [org.quartz.impl.StdScheduler] to required type [org.springframework.scheduling.quartz.SchedulerFactoryBean] for property ‘scheduler’: no matching editors or conversion strategy found
大致错误意思为类型不匹配。
上网查了一下
<bean id=”Scheduler” lazy-init=”false” autowire=”no” class=”org.springframework.scheduling.quartz.SchedulerFactoryBean” > </bean> 它是一个工厂bean,得到的不是它本身,而是它负责创建的org.quartz.impl.StdScheduler对象 只要把Service中的
private SchedulerFactoryBean localQuartzScheduler
改成
private Scheduler scheduler;
这样就可以。
为什么在xml定义的是 SchedulerFactoryBean 而注入的确是 org.quartz.impl.StdScheduler?
上网查查 原来是FactoryBean导致的?
FactoryBean接口是插入到Spring IoC容器用来定制实例化逻辑的一个接口点。如果你有一些复杂的初始化代码用Java可以更好来表示,而不是用(可能)冗长的XML,那么你就可以创建你自己的FactoryBean,并在那个类中写入复杂的初始化动作,然后把你定制的FactoryBean插入容器中。
FactoryBean接口提供三个方法:
Object getObject():返回一个由这个工厂创建的对象实例。这个实例可能被共享(取决于isSingleton()的返回值是singleton或prototype)。
boolean isSingleton():如果要让这个FactoryBean创建的对象实例为singleton则返回true,否则返回false。
Class getObjectType():返回通过getObject()方法返回的对象类型,如果该类型无法预料则返回null。
查看ApplicationContext 的getBean方法,如果获取的bean实现了FactoryBean接口在getBean时代码如下:
Java代码
- private Object doGetObjectFromFactoryBean(FactoryBean factory, String beanName, boolean shouldPostProcess)
- throws BeanCreationException
- {
- Object object;
- try
- {
- //这里通过getObject返回对象,这里的object为Scheduler的实例
- object = factory.getObject();
- }
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142161.html原文链接:https://javaforall.cn