我有一个Spring SpEL问题来评估@Value注释中的if-then-else构造:
<context:annotation-config />
<context:property-placeholder location="file://${HOME}/maven.props/${USER}.properties" properties-ref="props" />
<bean id="props" class="java.util.Properties">
<constructor-arg>
<props>
<prop key="interfaceName">createupdateproduct</prop>
<prop key="destImportFilesDirectoryPath">${batch.job.import.zipDestinationPath}/${interfaceName}/imported</prop>
<prop key="sourceImportFilesDirectoryPath">${batch.job.import.sourceImportPath}/${interfaceName}/import</prop>
<prop key="reportDirectoryPath">${batch.job.import.reportPath}/createupdateproduct/report</prop>
</props>
</constructor-arg>
</bean>
@Value("#{jobParameters['destFile']} ?: ${destImportFilesDirectoryPath}")
private String destImportFilesDirectoryPath;
问题。如果bean jobParameters ['destFile']为null,我想切换到占位符值。 jobParameters是Spring Batch放在上下文中的bean。
之前的代码片段无法正常工作,但#{jobParameters ['destFile']}和$ {destImportFilesDirectoryPath}都是正确评估的:O
我尝试不同的解决方案,例如:
@Value("#{jobParameters['destFile']} != null ? #{jobParameters['destFile']} : ${destImportFilesDirectoryPath}")
OR
@Value("#{ org.apache.commons.lang.StringUtils.isNotEmpty(#{jobParameters['destFile']}) ? #{jobParameters['destFile']} : ${destImportFilesDirectoryPath} }")
OR
@Value("${ #{jobParameters['destFile']} ?: ${destImportFilesDirectoryPath} }")
但没有正常工作!
答案 0 :(得分:1)
@Value("#{jobParameters['destFile'] ?: props['destImportFilesDirectoryPath']}")
解决方案不起作用:if(“#{jobParameters ['destFile']}被赋值,其值被赋值,否则它在字符串属性中赋值为null。
我也尝试过以下解决方案,但没有成功:
@Value("file:#{jobParameters['destFile'] ?: T((java.util.Properties)props).getProperty('destImportFilesDirectoryPath')}")
为区分批处理作业,我使用其他参数,如用户,互操作性接口名称等。
答案 1 :(得分:0)
如果您想使用spEL,请尝试
@Value("#{jobParameters['destFile'] ?: props['destImportFilesDirectoryPath']}")
但是,IMO,最好的选择是在开始工作之前用正确的值填充'destFile'
。
我也有一个(也许是愚蠢的)问题:
工作参数用于以独特的方式识别工作;您确定要将'null'
存储为作业参数值并在运行时更改它吗?如果你第二次跑步会怎么样?