2013-10-03 3 views
1

я получаю следующее исключение при запуске моего приложения Spring:org.springframework.beans.factory.NoSuchBeanDefinitionException: Нет Уникальный боб типа [org.quartz.JobDetail] определяется

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> 

EDIT: я сузил проблему к этому. Я создал класс под названием 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(); 

Это линия дает мне ошибку.

EDIT 2: Я предполагаю, что проблема в том, что мне требуется много заданий для запуска. Таким образом, я создал

ObjectFactory<JobDetail> jobDetailFactory

для захвата объектов через jobDetailFactory боба. Я думаю, линия

JobDetail jobDetail = jobDetailFactory.getObject()

не в состоянии выяснить, какие JobDetail фасоль, чтобы получить, так как она имеет две детали работы. Я не понимаю, как нотация @Qualifier поможет в определении этого. Любой конкретный способ, которым я могу разрешить эту ошибку ..?

+0

Выполняете ли вы свои бобовые по «типу» в любом месте весеннего контекста? – prabugp

+0

где указано определение 'jobDetail'. можете ли вы добавить это также к своему вопросу. –

+0

Это предусмотрено в корневом контексте. – user2339071

ответ

0

проверить, если вы предоставите же имя боб (дублируется) @type («имя компонента здесь») на обоих рабочих подробно боба

Edit- вы можете поделиться jobdetail (SMTPMailJob и QuartzScheduler) классов боба здесь. Я не вижу никакой проблемы с конфигурацией XML

добавить @Qualifier аннотацию, где когда-либо вы автоматически электромонтажная jobdetail боб

Например

если вы автоматической проводкой Quartzscheduler затем

@Autowired 
@Qualifier(Quartzscheduler) 
public JobDetail quartzSchedulerbean 

поскольку у вас есть два компонента детализации детали, во время работы весна не знает, какой bean-компонент будет подключен, потому что мы ссылаемся на bean-компоненты этого типа. поэтому добавление аннотации @Qualifier покажет весне, чтобы автоматически связать конкретный экземпляр компонента.

Обновление: - поскольку код, которым вы поделились, не дает мне больше ввода, основная проблема из-за того, что вы получаете, как я сказал в приведенном выше описании.

  1. у вас есть два jobdetails типа quartz.jobdetail
  2. у вас есть один jobdetail в jobdetail заводе.

ok, вы сказали, что получаете исключение, когда вы делаете objectFactory.getObject(), что означает пункт 2, в этом случае вы не должны получать исключение, упомянутое в вопросе, поскольку у вас есть только один компонент в фабрика рабочих мест. В соответствии с моим пониманием вы должны получить исключение, в то время как автоувеличивание заданий заданий, заданных в schedulerbeanfactory, не в объектно-объектном объекте.

EDIT - проверить эту ссылку Problem with Autowiring & No unique bean

+0

любезно проверять правку 2. У меня нет других деклараций 'jobDetail', кроме одной строки кода. – user2339071

0

, как вы можете видеть, вы определяете два зерна, которые имеют тот же тип:

jobDetail и quartzSchedulerRuntime относятся к типу org.springframework.scheduling.quartz.JobDetailBean

Вы можете отличить их по их имени (quartzSchedulerRuntime/jobDetail), но если вы их автоустанавливаете по типу (... JobDetailBean), это однозначно.

+0

Итак, как я могу разрешить это ...? – user2339071

+0

Предполагая, что вы используете конструкцию вроде: @Autowire JobDetailBean jobDetails; затем вы можете изменить его на @Resource (name = "jobDetail") JobDetailBean jobDetails; –

Смежные вопросы