2017-01-06 1 views
1

私はSpring Batch - MongoDB to XMLの例を開発中です。この例では、メインメソッドを実行すると、以下のエラーが表示されます。以下のエラーについてご案内してください。私はウェブ上で解決策を見つけようとしましたが、まだウェブ上で役立つものは見つけられません。Springバッチ - MongoDB to XML - 原因:java.lang.IllegalStateException:入力を変換する型が必要です

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'step1': Cannot resolve reference to bean 'mongodbItemReader' while setting bean property 'itemReader'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongodbItemReader' defined in class path resource [job-report.xml]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: A type to convert the input into is required. 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359) 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1492) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1237) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:552) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:740) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93) 
    at com.mkyong.App.main(App.java:15) 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mongodbItemReader' defined in class path resource [job-report.xml]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: A type to convert the input into is required. 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1589) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:554) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351) 
    ... 15 more 
Caused by: java.lang.IllegalStateException: A type to convert the input into is required. 
    at org.springframework.util.Assert.state(Assert.java:392) 
    at org.springframework.batch.item.data.MongoItemReader.afterPropertiesSet(MongoItemReader.java:200) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1648) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1585) 
    ... 22 more 

database.xml

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

     <!-- connect to mongodb --> 
    <mongo:mongo host="127.0.0.1" port="27017" /> 
    <mongo:db-factory dbname="yourdb" /> 

    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> 
     <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> 
    </bean> 

</beans> 

のcontext.xml

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

    <bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/> 

    <!-- stored job-meta in memory --> 
    <bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"> 
     <property name="transactionManager" ref="transactionManager" /> 
    </bean> 


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

ジョブreport.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:batch="http://www.springframework.org/schema/batch" xmlns:task="http://www.springframework.org/schema/task" 
    xmlns:util="http://www.springframework.org/schema/util" 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 
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> 

    <batch:job id="reportJob"> 
     <batch:step id="step1"> 
      <batch:tasklet> 
       <batch:chunk reader="mongodbItemReader" writer="xmlItemWriter" commit-interval="1"> 
       </batch:chunk> 
      </batch:tasklet> 
     </batch:step> 
    </batch:job> 

    <bean id="mongodbItemReader" class="org.springframework.batch.item.data.MongoItemReader"> 
     <property name="template" ref="mongoTemplate" /> 
     <property name="collection" value="report" /> 
    </bean> 

    <bean id="xmlItemWriter" class="org.springframework.batch.item.xml.StaxEventItemWriter"> 
     <property name="resource" value="classpath:xml/report.xml" /> 
     <property name="marshaller" ref="reportMarshaller" /> 
     <property name="rootTagName" value="record" /> 
    </bean> 

    <!-- ==== Solution-1 ==== --> 
    <bean id="reportMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
     <property name="classesToBeBound"> 
      <value>com.mkyong.Report</value> 
     </property> 
    </bean> 

    <!-- ==== Solution-2 ==== --> 
    <!-- <bean id="reportMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller"> 
     <property name="aliases"> 
      <util:map id="aliases"> 
       <entry key="record" value="com.mkyong.Report" /> 
      </util:map> 
     </property> 
     <property name="converters"> 
      <array> 
       <ref bean="reportConverter" /> 
      </array> 
     </property> 
    </bean> --> 

    <bean id="reportConverter" class="com.mkyong.ReportConverter" /> 
</beans> 

Repoer.java

@XmlRootElement(name = "record") 
public class Report { 

    private int id; 
    private Date date; 
    private long impression; 
    private int clicks; 
    private BigDecimal earning; 

    @XmlAttribute(name = "id") 
    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    @XmlElement(name = "date") 
    public Date getDate() { 
     return date; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 

    @XmlElement(name = "impression") 
    public long getImpression() { 
     return impression; 
    } 

    public void setImpression(long impression) { 
     this.impression = impression; 
    } 

    @XmlElement(name = "clicks") 
    public int getClicks() { 
     return clicks; 
    } 

    public void setClicks(int clicks) { 
     this.clicks = clicks; 
    } 

    @XmlElement(name = "earning") 
    public BigDecimal getEarning() { 
     return earning; 
    } 

    public void setEarning(BigDecimal earning) { 
     this.earning = earning; 
    } 
} 

App.java

public class App { 
    public static void main(String[] args) { 

     String[] springConfig = { "database.xml", "context.xml", "job-report.xml" }; 

     ApplicationContext context = new ClassPathXmlApplicationContext(springConfig); 

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

     try { 
      JobExecution execution = jobLauncher.run(job, new JobParameters()); 
      System.out.println("Exit Status : " + execution.getStatus()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     System.out.println("Done"); 
    } 
} 

あなたは、この上で助けてもらえますか?

答えて

0

ありがとうございます@Sergio、あなたからの大きな助けでしたが、以下の設定作業があります。

<bean id="mongodbItemReader" class="org.springframework.batch.item.data.MongoItemReader"> 
     <property name="template" ref="mongoTemplate" /> 
     <property name="collection" value="report" /> 
     <property name="targetType" value="com.mkyong.model.Report" /> 
     <property name="query" value="{'_id':{$gt:0} }" /> 
     <property name="sort"> 
      <util:map> 
       <entry key="id" value="#{T(org.springframework.data.domain.Sort.Direction).ASC}" /> 
      </util:map> 
     </property> 
    </bean> 

私が見る唯一の問題は何もXMLファイルに書き込まれていません。私はこの問題について別の質問を提起します。

注:このエラーの主な理由は、<property name="targetType" value="com.mkyong.model.Report" />このプロパティを正しく設定する必要があるためです。

また別の解決策としてhttp://www.mkyong.com/spring-batch/how-to-convert-date-in-beanwrapperfieldsetmapper/を参照することもできます。

0

エラーが指摘するように、「mongodbItemReader」Beanに「type」プロパティを設定する必要があります。

MongoItemReader javadocを参照してください。

例:

<bean id="mongodbItemReader" class="org.springframework.batch.item.data.MongoItemReader"> 
    <property name="template" ref="mongoTemplate" /> 
    <property name="collection" value="report" /> 
    <property name="targetType" value="Report.class" /> 
</bean> 

あなたは(私はそれを試していない)値でパッケージ名を指定する必要があります。

+0

いいえ、その動作しません。私はいくつかの他のエラーを取得します。原因: 'org.springframework.beans.TypeMismatchException:型[java.lang.String]のプロパティ値を、プロパティ 'targetType'の必須型[java.lang.Class]に変換できませんでした。ネストされた例外はjava.lang.IllegalArgumentExceptionです:クラス[com.mkyong.model.Report.class] 'が見つかりません' –

関連する問題