2013-09-16 9 views
0

Я использую пакетное приложение Spring и хочу использовать позднюю привязку для stepExecutionContext. Я столкнулся с проблемами при разрешении моей ошибки.Связывание с поздними партиями для stepExecutionContext не работает

Ниже мой читатель, который имеет SQL свойство с помощью позднего связывания:

<bean id="itemReader_S4_JPolicy" class="com.aegonusa.etl.readers.JDBCItemReader" scope="step"> 
    <property name="jobParameters" ref="jobParameters" /> 
    <property name="dataSource" ref="readDataSource" /> 
    <property name="rowMapper"> 
    <bean class="com.aegonusa.etl.readers.ResultSetRowMapper" scope="step" /> 
    </property> 
    <property name="sql" 
     value="#{stepExecutionContext['readQuery']}"></property> 
</bean> 

Я установить это свойство ('readQuery') в следующем классе:

общественный класс StepListener реализует StepExecutionListener {

.... ....

@Override 
public void beforeStep(StepExecution execution) { 
      String s = "select getdate(); 
    StepSynchronizationManager.getContext().setAttribute("readQuery", s); 

..... } ..... }

Пожалуйста, обратите внимание, что я могу сделать позднее связывание с использованием jobParameters. Но используя stepExecutionContext, я получаю следующий exc. Я попробовал много постов в форумах, но я не в состоянии разрешить его:

Throwable occurred: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'lazyBindingProxy.itemReader_S4_JPolicy#sysinit' defined in class path resource [Load_InforceToStage.xml]: Initialization of bean failed; nested exception is java.lang.IllegalStateException: Cannot bind to placeholder: stepExecutionContext['readQuery'] 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:480) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) 
at java.security.AccessController.doPrivileged(AccessController.java:224) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) 
at org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:302) 
at org.springframework.batch.core.scope.StepScope.get(StepScope.java:150) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) 
at org.springframework.batch.core.scope.util.PlaceholderTargetSource.getTarget(PlaceholderTargetSource.java:185) 
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:184) 
at $Proxy1.close(Unknown Source) 
at org.springframework.batch.item.support.CompositeItemStream.close(CompositeItemStream.java:83) 
at org.springframework.batch.core.step.item.ChunkMonitor.close(ChunkMonitor.java:99) 
at org.springframework.batch.item.support.CompositeItemStream.close(CompositeItemStream.java:83) 
at org.springframework.batch.core.step.tasklet.TaskletStep.close(TaskletStep.java:297) 
at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:255) 
at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:135) 
at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:61) 
at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:60) 
at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:144) 
at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:124) 
at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:135) 
at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:281) 
at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:120) 
at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:49) 
at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:114) 
at org.springframework.batch.core.launch.support.CommandLineJobRunner.start(CommandLineJobRunner.java:349) 
at org.springframework.batch.core.launch.support.CommandLineJobRunner.main(CommandLineJobRunner.java:574) 
at com.ebsadm.lh.LHSHEDToStage.runJob(LHSHEDToStage.java:124) 
at com.ebsadm.lh.LHSHEDToStage.main(LHSHEDToStage.java:111) 
at com.ebdadm.lh.TestLHSHEDToStage.testInforceLoadToStage(TestLHSHEDToStage.java:28) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) 
at java.lang.reflect.Method.invoke(Method.java:600) 
at junit.framework.TestCase.runTest(TestCase.java:168) 
at junit.framework.TestCase.runBare(TestCase.java:134) 
at junit.framework.TestResult$1.protect(TestResult.java:110) 
at junit.framework.TestResult.runProtected(TestResult.java:128) 
at junit.framework.TestResult.run(TestResult.java:113) 
at junit.framework.TestCase.run(TestCase.java:124) 
at junit.framework.TestSuite.runTest(TestSuite.java:232) 
at junit.framework.TestSuite.run(TestSuite.java:227) 
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:79) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

Вызванный: java.lang.IllegalStateException: Не может связываться с заполнителем: stepExecutionContext [ «»] readQuery в org.springframework.batch.core .scope.util.PlaceholderTargetSource $ 1.convertIfNecessary (PlaceholderTargetSource.java:140) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty (AbstractAutowireCapableBeanFactory.java:1294) в org.springframework.beans.factory.support. AbstractAutowireCapableBeanFactory.applyPropertyValues ​​(AbstractAutowireCapableBeanFactory.java:1250) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFa ctory.populateBean (AbstractAutowireCapableBeanFactory.java:1010) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:472) ... 50 более

Пожалуйста, помогите.

+0

Ваш 'ResultSetRowMapper' уже является областью действия по шагам, так как он связан с жизненным циклом охватывающего компонента (который уже находится в шаге). –

ответ

1

Я ожидал бы звонка getExecutionContext на StepExecution, чтобы дать вам правильный контекст.

@Override 
public void beforeStep(StepExecution execution) { 
    String s = "select getdate()"; 
    execution.getExecutionContext().putString("readQuery", s); 
} 

Ваше текущее решение принимает StepContext. StepContext - объект, который подвергается воздействию и используется для синтаксического анализа выражений, тогда как ExecutionContext, связанный с StepExecution, является фактическим текстом stageExecutionContext. ItemReaders и ItemWriters, и такой объект также использует ExecutionContext для обновления состояния (пропущенные объекты, количество фиксаций и т. Д.).

+0

Большое спасибо. Оно работало завораживающе.Однако я не могу понять разницу между контекстом, полученным из execute.getExecutionContext() и контекстом, полученным из StepSynchronizationManager.getContext(). Насколько они разные ? –

0

Попробуйте любого из ниже:

  1. Использования promotionListener боба для продвижения сферы переменных от шага к работе.
  2. Используйте bean вместо executeContext.

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

  • Нет связанных вопросов^_^