dim*_*zak 1 xml spring spring-batch spring-el
我试图spel if statement在xml配置中使用但没有成功:
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>
Run Code Online (Sandbox Code Playgroud)
该${step3.index.incremental.folder}工作=>解析为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>
Run Code Online (Sandbox Code Playgroud)
由于它是一个SpEL,因此它具有一些带有一些变量的评估上下文.它是一个有效的Java(几乎)表达式.
这应该工作:
<property name="resources" value="#{jobParameters['isIncremental'] eq 1? '${step3.index.incremental.folder}/' + stepExecutionContext['fileName'] + '/*.xml' : true }">
Run Code Online (Sandbox Code Playgroud)
在这种情况下,jobParameters和stepExecutionContext是EvalCtx变量,因此您应该按原样使用它们.
这#{是SpEL的开始,}- 结束.简而言之,您不能像在样本中显示的那样使用子SpEL.
由于您要从SpEL获取字符串值,并且某些部分是从PropertyPlaceholder解析的,因此您应该在这些部分和那个部分之间使用字符串连接,这应该在运行时针对步骤评估上下文进行解析.
注意,属性占位符在启动阶段得到解析,因此它们只是运行时目标SpEL的文字.