2016-04-01 19 views
0

Spring Batch- MultiResourceItemReader & HibernateItemWriter örneğini geliştiriyorum. Kodu başarılı bir şekilde derleyebildiğim, ancak çalıştırmayı denediğimde, aşağıdaki hatanın geldiğini görüyorum, burada neyin yanlış gittiğinden emin değilim.Nedeni: java.lang.ClassNotFoundException: org.springframework.context.event.EventListenerFactory - Yaylı Batch

Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from URL location [classpath:context-model.xml] 
Offending resource: class path resource [spring-batch-context.xml]; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [context-model.xml]; nested exception is java.lang.NoClassDefFoundError: org/springframework/context/event/EventListenerFactory 
    at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:70) 
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85) 
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:76) 
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:229) 
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseDefaultElement(DefaultBeanDefinitionDocumentReader.java:180) 
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:165) 
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:138) 
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:94) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:392) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:252) 
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127) 
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93) 
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129) 
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:540) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:454) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 
    at com.websystique.springbatch.Main.main(Main.java:16) 
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [context-model.xml]; nested exception is java.lang.NoClassDefFoundError: org/springframework/context/event/EventListenerFactory 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:414) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217) 
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:223) 
    ... 20 more 
Caused by: java.lang.NoClassDefFoundError: org/springframework/context/event/EventListenerFactory 

ExamResult.java

@Entity 
@Table(name = "EXAM_RESULT") 
public class ExamResult { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 

    @Column(name = "STUDENT_NAME", nullable = false) 
    private String studentName; 

    @Column(name = "DOB", nullable = false) 
    @Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDate") 
    private LocalDate dob; 

    @Column(name = "PERCENTAGE", nullable = false) 
    private double percentage; 
    // setters and getters 
} 

ExamResultFieldSetMapper.java

public class ExamResultFieldSetMapper implements FieldSetMapper<ExamResult>{ 

    public ExamResult mapFieldSet(FieldSet fieldSet) throws BindException { 
     ExamResult result = new ExamResult(); 
     result.setStudentName(fieldSet.readString(0)); 
     result.setDob(new LocalDate(fieldSet.readDate(1,"dd/MM/yyyy"))); 
     result.setPercentage(fieldSet.readDouble(2)); 
     return result; 
    } 
} 

ExamResultItemProcessor.java

public class ExamResultItemProcessor implements ItemProcessor<ExamResult, ExamResult> { 

    @Override 
    public ExamResult process(ExamResult result) throws Exception { 
     System.out.println("Processing result :"+result); 
     if(result.getPercentage() < 60){ 
      return null; 
     } 
     return result; 
    } 
} 

ExamResultJobListener.java

public class ExamResultJobListener implements JobExecutionListener{ 

    private DateTime startTime, stopTime; 

    @Override 
    public void beforeJob(JobExecution jobExecution) { 
     startTime = new DateTime(); 
     System.out.println("---------------------------------"); 
     System.out.println("ExamResult Job starts at :"+startTime); 
    } 


    @Override 
    public void afterJob(JobExecution jobExecution) { 
     stopTime = new DateTime(); 
     System.out.println("ExamResult Job stops at :"+stopTime); 
     System.out.println("Total time take in millis :"+getTimeInMillis(startTime , stopTime)); 
     System.out.println("---------------------------------"); 


     if(jobExecution.getStatus() == BatchStatus.COMPLETED){ 
      System.out.println("ExamResult job completed successfully"); 
      //Here you can perform some other business logic like cleanup 
     }else if(jobExecution.getStatus() == BatchStatus.FAILED){ 
      System.out.println("ExamResult job failed with following exceptions "); 
      List<Throwable> exceptionList = jobExecution.getAllFailureExceptions(); 
      for(Throwable th : exceptionList){ 
       System.err.println("exception :" +th.getLocalizedMessage()); 
      } 
     } 
    } 

    private long getTimeInMillis(DateTime start, DateTime stop){ 
     return stop.getMillis() - start.getMillis(); 
    } 
} 

Main.java

public class Main { 

    @SuppressWarnings("resource") 
    public static void main(String areg[]){ 

     ApplicationContext context = new ClassPathXmlApplicationContext("spring-batch-context.xml"); 

     JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher"); 
     Job job = (Job) context.getBean("examResultJob"); 

     try { 
      JobExecution execution = jobLauncher.run(job, new JobParameters()); 
      System.out.println("Job Exit Status : "+ execution.getStatus()); 

     } catch (JobExecutionException e) { 
      System.out.println("Job ExamResult failed"); 
      e.printStackTrace(); 
     } 
    } 
} 

bağlama datasource.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:batch="http://www.springframework.org/schema/batch" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

    <context:property-placeholder location="classpath:database.properties" /> 

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
     <property name="driverClassName" value="${driver.class.name}" /> 
     <property name="url" value="${jdbc.url}" /> 
     <property name="username" value="${jdbc.username}" /> 
     <property name="password" value="${jdbc.password}" /> 
    </bean> 
</beans> 

bağlama model.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd" 
          default-autowire="byName" default-init-method="init"> 

    <import resource="classpath:context-datasource.xml"/> 

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" > 
     <property name="dataSource" ref="dataSource"/> 
     <property name="packagesToScan"> 
      <list> 
       <value>com.websystique.springbatch.model</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <!-- <prop key="hibernate.format_sql">true</prop> --> 
      </props> 
     </property>  
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" /> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 

</beans> 

yay toplu context.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:batch="http://www.springframework.org/schema/batch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/batch 
     http://www.springframework.org/schema/batch/spring-batch.xsd 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <import resource="classpath:context-model.xml"/> 


    <!-- JobRepository and JobLauncher are configuration/setup classes --> 
    <bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean" /> 

    <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> 
     <property name="jobRepository" ref="jobRepository" /> 
    </bean> 

    <!-- ============= Multi Resource Item Reader ================== --> 
    <bean id="multiResourceItemReader" class="org.springframework.batch.item.file.MultiResourceItemReader"> 
     <property name="resources" value="classpath:csv/ExamResult*.txt" /> 
     <property name="delegate" ref="flatFileItemReader" /> 
    </bean> 


    <!-- =========== ItemReader reads a complete line one by one from input file ============--> 
    <bean id="flatFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step"> 

     <property name="lineMapper"> 
      <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper"> 

       <property name="fieldSetMapper"> 
        <!-- Mapper which maps each individual items in a record to properties in POJO --> 
        <bean class="com.websystique.springbatch.ExamResultFieldSetMapper" /> 
       </property> 

       <property name="lineTokenizer"> 
        <!-- A tokenizer class to be used when items in input record are separated by specific characters --> 
        <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> 
         <property name="delimiter" value="|" /> 
        </bean> 
       </property> 
      </bean> 
     </property> 
    </bean> 


    <!-- ItemWriter which writes data to database --> 
    <bean id="databaseItemWriter" class="org.springframework.batch.item.database.HibernateItemWriter"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 


    <!-- Optional ItemProcessor to perform business logic/filtering on the input records --> 
    <bean id="itemProcessor" class="com.websystique.springbatch.ExamResultItemProcessor" /> 

    <!-- Optional JobExecutionListener to perform business logic before and after the job --> 
    <bean id="jobListener" class="com.websystique.springbatch.ExamResultJobListener" /> 


    <!-- =========== Actual Job =========== --> 
    <batch:job id="examResultJob"> 
     <batch:step id="step1"> 
      <batch:tasklet transaction-manager="transactionManager"> 
       <batch:chunk reader="multiResourceItemReader" writer="databaseItemWriter" 
        processor="itemProcessor" commit-interval="10" /> 
      </batch:tasklet> 
     </batch:step> 
     <batch:listeners> 
      <batch:listener ref="jobListener" /> 
     </batch:listeners> 
    </batch:job> 
</beans>  

pom.xml

<properties> 
     <java.version>1.8</java.version> 
     <springframework.version>4.2.4.RELEASE</springframework.version> 
     <springbatch.version>3.0.1.RELEASE</springbatch.version> 
     <hibernate.version>4.3.6.Final</hibernate.version> 
     <!-- <hibernate.version>4.3.11.Final</hibernate.version> --> 
     <javassist.version>3.18.1-GA</javassist.version> 
     <!-- <javassist.version>3.20.0-GA</javassist.version> --> 
     <mysql.version>5.1.31</mysql.version> 
     <joda-time.version>2.3</joda-time.version> 
     <c3p0.version>0.9.5-pre8</c3p0.version> 
    </properties> 

    <dependencies> 

     <!-- Spring Core --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>${springframework.version}</version> 
     </dependency> 

     <!-- Spring TX --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-tx</artifactId> 
      <version>${springframework.version}</version> 
     </dependency> 

     <!-- Spring ORM support --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-orm</artifactId> 
      <version>${springframework.version}</version> 
     </dependency> 

     <!-- Spring Batch --> 
     <dependency> 
      <groupId>org.springframework.batch</groupId> 
      <artifactId>spring-batch-core</artifactId> 
      <version>${springbatch.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.batch</groupId> 
      <artifactId>spring-batch-infrastructure</artifactId> 
      <version>${springbatch.version}</version> 
     </dependency> 

     <!-- Hibernate related dependencies --> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>${hibernate.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.javassist</groupId> 
      <artifactId>javassist</artifactId> 
      <version>${javassist.version}</version> 
     </dependency> 

     <!-- Joda-Time --> 
     <dependency> 
      <groupId>joda-time</groupId> 
      <artifactId>joda-time</artifactId> 
      <version>${joda-time.version}</version> 
     </dependency> 

     <!-- To map JodaTime with database type --> 
     <dependency> 
      <groupId>org.jadira.usertype</groupId> 
      <artifactId>usertype.core</artifactId> 
      <version>3.0.0.CR1</version> 
     </dependency> 

     <!-- MySQL --> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>${mysql.version}</version> 
     </dependency> 

     <!-- ComboPooledDataSource --> 
     <dependency> 
      <groupId>com.mchange</groupId> 
      <artifactId>c3p0</artifactId> 
      <version>${c3p0.version}</version> 
     </dependency> 
    </dependencies> 

cevap

6

Basitçe bunu kullanın. Spring Batch'i severim. Umarım bu güzel çalışır.

<springframework.version>4.2.4.RELEASE</springframework.version> 
<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-web</artifactId> 
    <version>${springframework.version}</version> 
</dependency> 

Yoksa gibi son sürümlerini kullanabilirsiniz aşağıda

<properties> 
     <java.version>1.8</java.version> 
     <springframework.version>4.2.4.RELEASE</springframework.version> 
     <!-- <springbatch.version>3.0.1.RELEASE</springbatch.version> --> 
     <springbatch.version>3.0.6.RELEASE</springbatch.version> 
     <hibernate.version>4.3.6.Final</hibernate.version> 
     <!-- <hibernate.version>4.3.11.Final</hibernate.version> --> 
     <javassist.version>3.18.1-GA</javassist.version> 
     <!-- <javassist.version>3.20.0-GA</javassist.version> --> 
     <mysql.version>5.1.31</mysql.version> 
     <joda-time.version>2.3</joda-time.version> 
     <c3p0.version>0.9.5-pre8</c3p0.version> 
    </properties> 

    <dependencies> 

     <!-- Spring Core --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>${springframework.version}</version> 
     </dependency> 

     <!-- Spring TX --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-tx</artifactId> 
      <version>${springframework.version}</version> 
     </dependency> 

     <!-- Spring ORM support --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-orm</artifactId> 
      <version>${springframework.version}</version> 
     </dependency> 

     <!-- Spring Web - Added Newly --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
      <version>${springframework.version}</version> 
     </dependency> 


     <!-- Spring Batch --> 
     <dependency> 
      <groupId>org.springframework.batch</groupId> 
      <artifactId>spring-batch-core</artifactId> 
      <version>${springbatch.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.batch</groupId> 
      <artifactId>spring-batch-infrastructure</artifactId> 
      <version>${springbatch.version}</version> 
     </dependency> 

     <!-- Hibernate related dependencies --> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>${hibernate.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.javassist</groupId> 
      <artifactId>javassist</artifactId> 
      <version>${javassist.version}</version> 
     </dependency> 

     <!-- Joda-Time --> 
     <dependency> 
      <groupId>joda-time</groupId> 
      <artifactId>joda-time</artifactId> 
      <version>${joda-time.version}</version> 
     </dependency> 

     <!-- To map JodaTime with database type --> 
     <dependency> 
      <groupId>org.jadira.usertype</groupId> 
      <artifactId>usertype.core</artifactId> 
      <version>3.0.0.CR1</version> 
     </dependency> 

     <!-- MySQL --> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>${mysql.version}</version> 
     </dependency> 

     <!-- ComboPooledDataSource --> 
     <dependency> 
      <groupId>com.mchange</groupId> 
      <artifactId>c3p0</artifactId> 
      <version>${c3p0.version}</version> 
     </dependency> 
    </dependencies> 
İlgili konular