运行Spring应用程序时出现以下异常:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of
type [org.quartz.JobDetail] is defined: expected single matching bean but found 2:
[quartzSchedulerRuntime, jobDetail]
这是我在root-context.xml
中配置石英的部分。
根context.xml中
<bean name="quartzSchedulerRuntime" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.task.QuartzScheduler" />
<property name="jobDataAsMap">
<map>
<entry key="runtimeReportServiceImpl" value-ref="RuntimeReportService" />
</map>
</property>
</bean>
<bean id="cronTriggerRuntime"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="quartzSchedulerRuntime" />
<property name="cronExpression" value="0 30 12 ? * MON *" />
</bean>
<bean id="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false">
<property name="schedulerContextAsMap">
<map>
<entry key="reportSchedulerServiceImpl" value-ref="reportSchedulerServiceImpl"></entry>
</map>
</property>
<property name="jobDetails">
<list>
<ref bean="quartzSchedulerRuntime" />
<ref bean="jobDetail"/>
</list>
</property>
<property name="triggers">
<list>
<ref bean="cronTriggerRuntime" />
<ref bean="jobTrigger"/>
</list>
</property>
</bean>
<bean id="jobDetailFactory"
class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
<property name="targetBeanName">
<idref local="jobDetail" />
</property>
</bean>
<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean"
scope="prototype">
<property name="jobClass" value="com.scheduler.SMTPMailJob " />
<property name="jobDataAsMap">
<map>
<entry key="reportSchedulerServiceImpl" value-ref="reportSchedulerServiceImpl" />
<entry key="filterUtil" value-ref="filterUtil" />
<entry key="reportService" value-ref="reportService" />
<entry key="fusionChartHtmlToImage" value-ref="fusionChartHtmlToImage"/>
<entry key="fcproperties" value-ref="fcproperties"/>
</map>
</property>
</bean>
<bean id="jobTriggerFactory"
class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
<property name="targetBeanName">
<idref local="jobTrigger" />
</property>
</bean>
<bean id="jobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean" scope="prototype">
<property name="jobDetail" ref="jobDetail" />
<property name="cronExpression" value="0 0 9 1/1 * ? *" />
</bean>
编辑:我已将问题缩小到此范围。我创建了一个名为RScheduler的类,用于安排作业。在那堂课中我宣布:
Scheduler scheduler;
ObjectFactory<JobDetail> jobDetailFactory;
ObjectFactory<CronTrigger> jobTriggerFactory;
@Autowired
public ReportScheduler(Scheduler scheduler,ObjectFactory<JobDetail> jobDetailFactory,ObjectFactory<CronTrigger> jobTriggerFactory)
throws SchedulerException
{
Assert.notNull(scheduler, "scheduler cannot be null");
Assert.notNull(jobDetailFactory, "jobDetailFactory cannot be null");
Assert.notNull(jobTriggerFactory, "jobTriggerFactory cannot be null");
this.scheduler = scheduler;
this.jobDetailFactory=jobDetailFactory;
this.jobTriggerFactory=jobTriggerFactory;
this.scheduler.getContext().put("reportSchedulerServ", reportSchedulerServ);
}
我用另一种方法调用这个工作,如:
JobDetail jobDetail = jobDetailFactory.getObject();
这是给我错误的一行。
编辑2:我猜测问题是我需要触发很多工作。所以我创建了
ObjectFactory<JobDetail> jobDetailFactory
通过jobDetailFactory
bean捕获对象。我想,行
JobDetail jobDetail = jobDetailFactory.getObject()
无法确定要获取哪个JobDetail bean,因为它有两个作业详细信息。我不明白@Qualifier
符号将如何帮助确定。我能解决这个错误的任何特定方式..?
答案 0 :(得分:0)
检查你是否在两个工作细节bean上给出了相同的bean名称(重复)@type(“bean name here”)
编辑 - 你可以在这里分享jobdetail(SMTPMailJob和QuartzScheduler)bean类吗?我没有看到xml配置的任何问题
添加@Qualifier
注释,无论你在哪里自动连接jobdetail bean
例如
如果你自动连接Quartzscheduler那么
@Autowired
@Qualifier(Quartzscheduler)
public JobDetail quartzSchedulerbean
因为你有两个job-detail bean,所以在运行时spring不知道要连接哪个bean,因为我们引用了它的类型的bean。所以添加@Qualifier注释会告诉spring自动连接特定的bean实例。
更新: - 因为你共享的代码并没有给我更多的输入,所以你在上面的陈述中所说的异常的基本问题。
quartz.jobdetail
好的,你说当你做objectFactory.getObject()时你得到异常,这意味着第2点,在这种情况下你不应该得到问题中提到的异常,因为你在jobdetail工厂只有一个bean 。 根据我的理解,你应该在schedulerbeanfactory中定义的自动装配jobdetails而不是在objectfactory对象中获得异常。
编辑 - 请检查此链接Problem with Autowiring & No unique bean
答案 1 :(得分:0)
如您所见,您定义了两个具有相同类型的bean:
jobDetail和quartzSchedulerRuntime属于这种类型 org.springframework.scheduling.quartz.JobDetailBean
你可以通过他们的名字来区分它们(quartzSchedulerRuntime / jobDetail),但是如果你通过Type(... JobDetailBean)自动装配它们,那就是它的暧昧。