if语句中的Spel错误(xml配置)

时间:2014-07-16 07:49:58

标签: xml spring spring-batch spring-el

我正在尝试在xml配置中使用spel if statement,但没有成功:

xml:

的一部分
<bean id="ExportReader"
                class="org.springframework.batch.item.file.MultiResourceItemReader"
                scope="step">
                <property name="resources" value="#{jobParameters['isIncremental'] eq 1? '${step3.index.incremental.folder}/#{stepExecutionContext['fileName']}/*.xml' : true }">
                <property name="delegate" ref="staxPatentReader"></property>
                <property name="strict" value="true"></property>
        </bean>

${step3.index.incremental.folder} work =&gt;解析为C:/但第二部分失败,因此我有C:/#{stepExecutionContext['fileName']}/*.xml

等资源

我想有一个问题是逃避单引号...

另一件事是这个xml工作正常:

<bean id="indexFolderPartitioner"class="com.mycompany.FolderPartitioner" scope="step">
                <property name="folder" value="#{jobParameters['isIncremental'] eq 1? '${step3.index.incremental.folder}' : '${step3.index.full.folder}' }"></property>
        </bean>

1 个答案:

答案 0 :(得分:5)

由于它是SpEL,因此它具有一些带有一些变量的评估上下文。它是一个有效的Java(几乎)表达式。

这应该有效:

<property name="resources" value="#{jobParameters['isIncremental'] eq 1? '${step3.index.incremental.folder}/' + stepExecutionContext['fileName'] + '/*.xml' : true }">

在这种情况下,jobParametersstepExecutionContext是EvalCtx变量,因此您应该按原样使用它们。

#{是SpEL的开始,} - 结束。简而言之,您不能像在样本中一样使用子SpEL。

由于您要从SpEL获取字符串值,并且某些部分是从PropertyPlaceholder解析的,因此您应该在这些部分之间使用字符串连接,这应该在运行时根据步骤评估上下文进行解析。

请注意,属性占位符在启动阶段得到解析,因此它们只是运行时目标SpEL的文字。