【问题标题】:Spring Batch : Field or property 'stepExecutionContext' cannot be foundSpring Batch:找不到字段或属性“stepExecutionContext”
【发布时间】:2014-01-14 11:29:55
【问题描述】:

我有以下春季批处理作业配置。有一个读取器,然后将详细信息传递给具有两个特定写入器的复合写入器。两个 writer 共享一个共同的 parent,并且需要使用相同的 JobId 来执行他们执行的 INSERT 操作。

<bean id="job" parent="simpleJob">
    <property name="steps">
        <list>
            <bean parent="simpleStep">
                <property name="itemReader" ref="policyReader"/>    
                <property name="itemWriter" ref="stagingCompositeWriter"/>
            </bean>
        </list>
    </property>
</bean>

<bean id="stagingCompositeWriter" class="org.springframework.batch.item.support.CompositeItemWriter">
    <property name="delegates">
        <list>
            <ref bean="stagingLoadWriter"/>
            <ref bean="stagingPolicyWriter"/>
        </list>
    </property>
</bean>

<bean id="abstractStagingWriter" class="a.b.c.AbstractStagingWriter" abstract="true">
    <property name="stepExecution" value="#{stepExecutionContext}"/>
    <property name="hedgingStagingDataSource" ref="hedgingStagingDataSource"/>
</bean>

<bean id="stagingLoadWriter" class="a.b.c.StagingLoadWriter" parent="abstractStagingWriter"/>

<bean id="stagingPolicyWriter" class="a.b.c.StagingPolicyWriter" parent="abstractStagingWriter"/>

当我运行我的代码时,我得到以下错误

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property 'stepExecutionContext' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext'
at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:208)
at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:72)
at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:93)
at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:88)
at org.springframework.context.expression.StandardBeanExpressionResolver.evaluate(StandardBeanExpressionResolver.java:139)

我尝试在不同的地方设置 scope="step" 但无济于事。有什么建议吗?

【问题讨论】:

  • 你能尝试用${stepExecutionContext}替换#{stepExecutionContext}吗?
  • 不要这么认为 - 美元符号会告诉上下文查找名称为“stepExecutionContext”的属性字段,我知道它不存在。
  • 我的假设:你不能直接连接 stepExecutionContext,所以使用 StepListener。否则尝试在所有 *Writer beans 中放置 scope="step"
  • 见 5.4。作业和步骤属性的后期绑定:docs.spring.io/spring-batch/2.2.x/reference/html/…
  • 要访问jobId,您也可以尝试使用stackoverflow.com/questions/20838522/…中指定的相同策略,但使用#{stepExecution.jobExecutionId}

标签: spring-batch


【解决方案1】:

您只能在 scope="step" 中定义的 bean 中访问 stepExecutionContext。 将您的 bean 定义更改为

<bean id="stagingLoadWriter" scope="step" class="a.b.c.StagingLoadWriter" parent="abstractStagingWriter" />

<bean id="stagingPolicyWriter" scope="step" class="a.b.c.StagingPolicyWriter" parent="abstractStagingWriter"/>

【讨论】:

  • 我仍然遇到同样的错误。我的代码是这样的:@Bean(name = "myMongoItemReader") @StepScope public ItemReader searchMongoItemReader()
猜你喜欢
  • 1970-01-01
  • 2018-02-06
  • 2023-03-11
  • 2017-12-29
  • 2018-03-31
  • 2018-08-07
  • 2016-11-16
  • 1970-01-01
  • 2016-04-11
相关资源
最近更新 更多