1

当使用实现 Ordered 且具有 scope="step" 的 skipListener 时,出现以下异常:

创建名称为“scopedTarget.scopedTarget.fisalisBatchMeldungenListener”的 bean 时出错:范围“步骤”对于当前线程无效;如果您打算从单例中引用它,请考虑为该 bean 定义一个作用域代理;嵌套异常是 java.lang.IllegalStateException: No context holder available for step scope

如果我不让我的侦听器实现 Ordered,则不会发生异常。

这是我的 Bean 定义:

<bean id="erzeuger" class="...." scope="step">
    <property name="user" ref="user" />
    <property name="termin" ref="termin" />
    <property name="services" ref="services" 
</bean>

<bean id="listener" class="Listenerclass" scope="step">
    <property name="erzeuger" ref="erzeuger" />
</bean>

这是我使用它的部分:

<step id="myStep" parent="abstractBatchStep" xmlns="http://www.springframework.org/schema/batch">
    <listeners merge="true">
    <listener ref="listener" />
    </listeners>
</step> 

有谁知道问题出在哪里?

4

1 回答 1

0

我有一点:

将侦听器添加到步骤时,该步骤会检查其是否实现了 Ordered。如果是,则该步骤将侦听器添加到集合中,该集合将使用比较器立即排序。这个比较器在监听器的实例上调用 getOrder(9不存在。

对于 sope="step" 阅读以下内容:

Scoped bean 以不同的方式工作。当上下文被创建时,这个 bean 被包装到额外的代理对象中(默认由 CGLIB 创建),它被传递给引用它的 bean(这个代理默认是单例的,例如共享的)。因此,每次在运行时在代理上调用方法时,Spring 都会与调用相交,请求工厂返回 bean 的实例并调用该 bean 上的方法。反过来,工厂可以在 HTTP 请求(“请求”范围)或 HTTP 会话(“会话”范围)中查找“真实”bean 实例和/或在必要时创建新实例。后期实例化允许使用“运行时”(范围)值初始化范围 bean,例如来自 HTTP 请求/会话的值,这些值在创建上下文时显然是未定义的。特别是“步” -scoped bean 绑定到线程本地(请记住,步骤并行运行以进行分区)。因此,当您在它们上调用方法时,作用域 bean 将被取消引用。最后,通过在作用域 bean 设置为另一个 bean(例如在 setter 中)之后调用任何方法,可以轻松打破这种优雅的 Spring“意识形态”:)

于 2013-10-29T12:33:03.260 回答