【问题标题】:Spring Boot | spring EL using with annotation attribute value to set any random value using properties弹簧靴 | spring EL 使用带有注释属性值来使用属性设置任何随机值
【发布时间】:2022-01-11 09:59:15
【问题描述】:

我正在使用一个现有的 spring boot 注释,并希望使用 spring 表达式动态设置属性值,并希望有一个常量值作为前缀,

示例代码 sn-p

@KafkaListener(topics="${topic.name}", groupId="#{'consumergroup' + (int)(java.lang.Math).random() }")
    public void consumerMethod(){
    
    }

我想使用上述实现为每个新容器创建一个新的消费者组。

但我面临以下异常。

表达式解析失败;嵌套异常是 org.springframework.expression.spel.SpelParseException:EL1041E:之后 解析一个有效的表达式,还有更多的数据在 表达式:'lparen(()

请帮助我使用 template spring EL 或我可以使用的任何其他方式来设置带有常量前缀的动态消费者组 ID。

【问题讨论】:

  • 您缺少一个结束}
  • @M.Deinum 我已经在我的代码中添加了 sn-p 但错过了在这里添加问题,请您现在检查一下。
  • 如果有人因为不懂就给负分,请告诉我,我会改正的。
  • AFAIK 你还需要在静态调用前加上T,比如(int) T(java.lang.Math).random()。我不认为它会起作用。
  • 另见我的回答。

标签: spring-boot java-8 spring-kafka spring-el


【解决方案1】:
groupId="#{'consumergroup' + (100 * T(Math).random()).intValue() }"
  1. SpEL 中没有cast 运算符。仅仅因为它在内部使用ConversionService 从一种类型转换为另一种类型。我以任何方式使用intValue(),因为random() 的结果是Double(不是double)——SpEL 强制转换为类型包装器以方便 API。
  2. java.lang 会自动导入到 SpEL 上下文中。 Math 类型无需添加。
  3. 100 *。参见Math.random() JavaDocs:它返回0.01.0 之间的值。所以,投射到int 总是只会给你带来0。强制转换不进行舍入。

另请参阅 Spring Boot 配置属性功能,您可以在其中为 groupId 使用随机值:

spring.kafka.consumer.group-id=consumergroup${random.int}

https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config.random-values

【讨论】:

    猜你喜欢
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    相关资源
    最近更新 更多