我正在尝试在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>
答案 0 :(得分:5)
由于它是SpEL,因此它具有一些带有一些变量的评估上下文。它是一个有效的Java(几乎)表达式。
这应该有效:
<property name="resources" value="#{jobParameters['isIncremental'] eq 1? '${step3.index.incremental.folder}/' + stepExecutionContext['fileName'] + '/*.xml' : true }">
在这种情况下,jobParameters
和stepExecutionContext
是EvalCtx变量,因此您应该按原样使用它们。
#{
是SpEL的开始,}
- 结束。简而言之,您不能像在样本中一样使用子SpEL。
由于您要从SpEL获取字符串值,并且某些部分是从PropertyPlaceholder解析的,因此您应该在这些部分之间使用字符串连接,这应该在运行时根据步骤评估上下文进行解析。
请注意,属性占位符在启动阶段得到解析,因此它们只是运行时目标SpEL的文字。