This is the reader configuration used by a job
The test class which attempts to test this reader.Code:<bean id="assetItemReader" class="org.springframework.batch.item.database.JdbcCursorItemReader" scope="step"> <property name="sql" value="${assetSql}"/> <property name="fetchSize" value="${fetchSize}"/> <property name="rowMapper" ref="assetMapper"/> <property name="dataSource" ref="dataSource"/> </bean>
The error message is " java.lang.IllegalStateException: No context holder available for step scope".Code:@ContextConfiguration @RunWith(SpringJUnit4ClassRunner.class) public class AssetItemReaderTests extends AbstractJobTests { @Autowired private ItemReader<Asset> reader; @Test public void testReadFromAsset() throws Exception { open(reader); List<Asset> inputs = getAssets(reader); close(reader); int itemCount = inputs.size(); assertTrue(itemCount > 0); for (int i = 0; i < itemCount; i++) { assertNotNull(inputs.get(i)); } } /** * Read all assets using the provided reader. */ private List<Asset> getAssets(ItemReader<Asset> reader) throws Exception { Asset asset; List<Asset> result = new ArrayList<Asset>(); while ((asset = reader.read()) != null) { result.add(asset); } return result; } /** * Open the reader if applicable. */ private void open(ItemReader<?> reader) { if (reader instanceof ItemStream) { ((ItemStream) reader).open(new ExecutionContext()); } } /** * Close the reader if applicable. */ private void close(ItemReader<?> reader) { if (reader instanceof ItemStream) { ((ItemStream) reader).close(); } } }
The full error log
Code:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.assetItemReader': Scope 'step' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No context holder available for step scope at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:188) at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:33) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:182) at $Proxy39.open(Unknown Source) at com.dcinv.dragon.infrastructure.batch.AssetItemReaderTests.open(AssetItemReaderTests.java:77) at com.dcinv.dragon.infrastructure.batch.AssetItemReaderTests.testReadFromAsset(AssetItemReaderTests.java:41) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180) at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62) at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140) at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127) at org.apache.maven.surefire.Surefire.run(Surefire.java:177) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:338) at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:997) Caused by: java.lang.IllegalStateException: No context holder available for step scope at org.springframework.batch.core.scope.StepScope.getContext(StepScope.java:193) at org.springframework.batch.core.scope.StepScope.get(StepScope.java:135) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) ... 38 more


Reply With Quote