Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java org.springframework.beans.factory.NoSuchBean定义异常:未定义类型为[org.quartz.JobDetail]的唯一bean_Java_Spring_Spring Mvc_Quartz Scheduler - Fatal编程技术网

Java org.springframework.beans.factory.NoSuchBean定义异常:未定义类型为[org.quartz.JobDetail]的唯一bean

Java org.springframework.beans.factory.NoSuchBean定义异常:未定义类型为[org.quartz.JobDetail]的唯一bean,java,spring,spring-mvc,quartz-scheduler,Java,Spring,Spring Mvc,Quartz Scheduler,我在运行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中配

我在运行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
中配置quartz的部分

根上下文.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>
这是给我错误的那一行

编辑2:我猜问题在于我需要触发许多作业。所以我创造了

ObjectFactory作业详细信息工厂

通过
jobDetailFactory
bean捕获对象。我想,这条线

jobdail jobdail=jobdailfactory.getObject()


无法确定要获取哪个JobDetailbean,因为它有两个作业详细信息。我不明白
@限定符
符号如何有助于确定这一点。有什么特殊的方法可以解决这个错误吗

检查您是否在两个作业细节bean上提供了相同的bean名称(重复)@type(“此处的bean名称”)

编辑-您可以在这里共享jobdetail(SMTPMailJob和QuartzScheduler)bean类吗。我认为xml配置没有任何问题

在自动连接jobdetail bean的位置添加
@Qualifier
注释

比如说

如果您是自动布线Quartzscheduler,则

@Autowired
@Qualifier(Quartzscheduler)
public JobDetail quartzSchedulerbean
因为您有两个作业细节bean,所以在运行时spring不知道连接哪个bean,因为我们引用了它类型的bean。所以添加@Qualifier注释将告诉spring自动连接特定的bean实例

更新:-由于您共享的代码没有给我更多的输入,基本的问题来自于异常,正如我在上面的声明中所说的

  • 您有两个类型为
    quartz.jobdetail
  • 在jobdetail工厂中有一个jobdetail
  • 好的,您说过当您执行objectFactory.getObject()时会遇到异常,这意味着第2点,在这种情况下,您不应该遇到问题中提到的异常,因为jobdetail工厂中只有一个bean。 根据我的理解,在自动关联schedulerbeanfactory中定义的作业详细信息而不是objectfactory对象时,应该会出现异常


    编辑-选中此链接可以看到,您定义了两个具有相同类型的bean:

    jobDetail和quartzSchedulerRuntime属于以下类型 org.springframework.scheduling.quartz.JobDetailBean


    您可以通过名称(quartzSchedulerRuntime/jobDetail)来区分它们,但如果您按类型自动关联它们(…JobDetailBean),这是不明确的。

    您是否在整个spring上下文中的任何位置按“类型”自动关联bean?您的
    jobDetail
    bean定义在哪里。你能把它也添加到你的问题中吗?它是在根上下文中提供的。假设你使用的是如下构造:@Autowire-JobDetailBean-jobDetails;然后您可以将其更改为@Resource(name=“jobdail”)jobdailbean jobdails;请检查编辑2。除了那一行代码之外,我没有任何关于
    jobdeail
    的声明。
    JobDetail jobDetail = jobDetailFactory.getObject();
    
    @Autowired
    @Qualifier(Quartzscheduler)
    public JobDetail quartzSchedulerbean