当前位置: 首页 > 知识库问答 >
问题:

当在Spring bean上有条件地设置属性值时,SpEL条件运算符的计算结果不符合预期(使用XML配置)

堵雅健
2023-03-14

在Spring批处理中,我需要基于一个正在从Job参数传递的标志,在一个bean上有条件地注入一个属性。
例如,如果作业参数“iscar”为“true”,则需要将字符串“car.xsd”作为属性传递,否则为“bus.xsd”。
我哪里做错了?

这是我尝试过的-
尝试#1

   <property name="schemaFileName" value="#{ jobParameters['ISCAR'] == 'true' ? 'Car.xsd : Bus.xsd'}" />
<property name="schemaFileName" value="#{ #{jobParameters['ISCAR'] == 'true'} ? 'Car.xsd' : 'Bus.xsd'}" />

给出:

原因:java.lang.IllegalStateException:无法绑定到占位符:true?“car.xsd”:“bus.xsd”

尝试#3

<property name="schemaFileName" value="${ #{jobParameters['ISCAR'] == 'true'} ? 'Car.xsd' : 'Bus.xsd'}" />
 <batch:step id="validateXMLSchema" abstract="true">
         <batch:tasklet ref="xmlSchemaValidator" />
    </batch:step>
JobParametersBuilder paramBuilder = new JobParametersBuilder();
paramBuilder.addString("ISCAR", "true");

编辑:添加堆栈跟踪

共有1个答案

宰父飞白
2023-03-14

我不知道为什么要引用jobparameters,好像它是一个映射

EL1027E:不支持索引到类型“org.springframework.batch.core.jobparameters”中

用那个。

"#{jobParameters.getString('ISCAR') == 'true' ? 'Car.xsd' : 'Bus.xsd'}"

下面是我的测试类:

@SpringBootApplication
public class So57204900Application {

    public static void main(String[] args) {
        SpringApplication.run(So57204900Application.class, args);
    }

    @Value("#{jobParameters.getString('ISCAR') == 'true' ? 'Car.xsd' : 'Bus.xsd'}")
    private String param;


    @Bean
    public ApplicationRunner runner() {
        return args -> {
            System.out.println(param);
        };
    }

    @Bean
    public JobParameters jobParameters() {
        return new JobParametersBuilder().addString("ISCAR", "false").toJobParameters();
    }

}
 类似资料:
  • 问题内容: 我对条件运算符有些疑惑。考虑以下两行: 为什么f1变为null且第二条语句引发NullPointerException? Langspec-3.0第15.25段说: 否则,第二和第三操作数分别为S1和S2类型。令T1为对S1进行装箱转换所产生的类型,而T2为对S2进行装箱转换所产生的类型。条件表达式的类型是将捕获转换(§5.1.10)应用于lub(T1,T2)(§15.12.2.7)的

  • 我对条件运算符有点困惑。请考虑以下两行: 为什么f1变成null,而第二条语句抛出NullPointerException? LANSPEC-3.0第15.25段SAIS: 否则,第二和第三操作数的类型分别为S1和S2。设T1是对S1应用装箱转换得到的类型,设T2是对S2应用装箱转换得到的类型。条件表达式的类型是将捕获转换(§5.1.10)应用于lub(T1,T2)(§15.12.2.7)的结果。

  • 问题内容: 我正在使用Python / Selenium提交表单,然后让Web驱动程序通过使用类ID的预期条件来等待下一页的加载。 我的问题是可以显示两个页面,但是它们没有共享原始页面中没有的唯一元素(我可以找到)。一页的唯一类为,而另一页可能的类ID为。 我想使用一个等待,寻找OR 出现。 是否可以将两个预期条件合并为一个等待? 我正在寻找的基本想法,但显然行不通: 我真的只需要编程以等待下一页

  • Java 提供了一个特别的三元运算符(也叫三目运算符)经常用于取代某个类型的 if-then-else 语句。 条件运算符的符号表示为“?:”,使用该运算符时需要有三个操作数,因此称其为三目运算符。使用条件运算符的一般语法结构为: 其中,expression 是一个布尔表达式。当 expression 为真时,执行 statement1, 否则就执行 statement3。此三元运算符要求返回一个

  • 主要内容:RxJava 条件运算符 介绍,RxJava 条件运算符 示例RxJava 条件运算符 介绍 以下是用于 Observable 的条件运算符。 运算符 描述 All 评估发出的所有项目以满足给定标准。 Amb 仅在给定多个 Observable 的情况下从第一个 Observable 发出所有项目。 Contains 检查 Observable 是否发出特定项目。 DefaultIfEmpty 如果 Observable 不发出任何内容,则发出默认项。 Se

  • GCC(4.8.2版)手册中规定了以下内容: < code >-ftree-loop-if-convert-stores :< br >尝试同时if-convert包含内存写入的条件跳转。这种转换对于多线程程序来说是不安全的,因为它将有条件的内存写入转换为无条件的内存写入。举个例子, 被转换为 可能产生数据竞争。 然而,我想知道使用与语句。 < li >在第一段代码中,只有满足条件时,< code