2013-10-03 5 views
1

나는 다음과 같은 예외가 정의된다 org.quartz.JobDetail] 유형의 없음 고유의 콩 :org.springframework.beans.factory.NoSuchBeanDefinitionException : 내 봄 응용 프로그램을 실행할 때

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(); 

이 나에게 오류를주는 라인입니다.

EDIT 2 : 나는 많은 문제가 발생해야한다는 것을 짐작하고있다. 그래서 jobDetailFactory 빈을 통해 개체를 캡처

ObjectFactory<JobDetail> jobDetailFactory

을 만들었습니다. 나는이 개 작업의 세부 사항을 가지고 있기 때문에

JobDetail jobDetail = jobDetailFactory.getObject()

이 얻을 수있는 JobDetail에 콩 알아낼 수없는 선을, 생각한다. 나는 그 결정에 @Qualifier 표기법이 어떻게 도움이 될지 이해하지 못한다. 이 오류를 해결할 수있는 모든 특정 방법 ..?

+0

전체 스프링 컨텍스트의 아무 곳에서나 '입력'하여 콩을 autowiring하고 있습니까? – prabugp

+0

여기서'jobDetail' 빈 정의가 있습니다. 질문에 추가 할 수 있습니까? –

+0

루트 컨텍스트에서 제공됩니다. – user2339071

답변

0

검사는 모두 작업 세부 콩에 당신이 만약 JobDetail (SMTPMailJob 및 QuartzScheduler) 여기에 빈 클래스를 공유 할 수 있습니다

편집 - 같은 빈 이름 (중복) @type ("여기에 콩 이름")을 제공 한 경우. 내가

하면 자동 배선 JobDetail의 빈 인스턴스를

를 들어

당신이 경우입니다 어느 @Qualifier 주석을 추가

XML 구성으로 모든 문제를보고 해달라고 자동 배선 다음

@Autowired 
@Qualifier(Quartzscheduler) 
public JobDetail quartzSchedulerbean 

을 Quartzscheduler을 두 개의 작업 - 세부 빈을 가지고 있기 때문에 런타임에 봄에 어떤 콩을 유선으로 인식할지는 알지 못한다. @Qualifier 어노테이션을 추가하면 특정 Bean 인스턴스를 자동 연결하는 스프링을 알 수있다.

업데이트 : - 당신이 공유 한 코드가 나에게 더 많은 정보를 주었기 때문에, 위의 진술에서 말한 것과 같은 예외로부터의 기본적인 문제.

  1. 당신은 유형 quartz.jobdetail
  2. 두 jobdetails 당신이 JobDetail의 공장에서 일하기 JobDetail을 가지고 있습니다.

좋아, 당신은 당신이 예외를지고 있다고 말했다 당신이 할 때 하나의 콩에 있기 때문에 당신이 질문에서 언급 한 예외가 안이 경우 포인트에는 2를 의미 objectFactory.getObject() jobdetail 공장. 제 생각에 objectfactory 객체가 아닌 schedulerbeanfactory에 정의 된 jobdetails를 autowiring하는 동안 예외가 발생해야합니다.

편집 -이 링크 Problem with Autowiring & No unique bean

+0

kindly check edit 2. 나는 한 줄의 코드를 제외하고는'jobDetail'을 선언하지 않았습니다. – user2339071

0

당신이 볼 수 있듯이, 동일한 유형이 두 콩 정의 확인 :

만약 JobDetail과 quartzSchedulerRuntime이 유형입니다

org.springframework.scheduling.quartz.JobDetailBean을

이름 (quartzSchedulerRuntime/jobDetail)으로 구별 할 수 있지만, 유형 (... JobDetailBean)을 사용하여 autowire하면 모호합니다.

+0

그래서 어떻게 해결할 수 있습니까 ..? – user2339071

+0

다음과 같은 구문을 사용한다고 가정합니다. @Autowire JobDetailBean jobDetails; 다음으로 변경할 수 있습니다. @Resource (name = "jobDetail") JobDetailBean jobDetails; –

관련 문제