Spring启动| spring EL 与注释属性值一起使用以使用属性设置任意随机值

Spring Boot | spring EL using with annotation attribute value to set any random value using properties

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

示例代码片段

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

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

但我遇到了以下异常。

Expression parsing failed; nested exception is org.springframework.expression.spel.SpelParseException: EL1041E: After parsing a valid expression, there is still more data in the expression: 'lparen(()

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

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:它 returns 介于 0.01.0 之间的值。所以,投射到 int 总是只会给你带来 0。铸造不做四舍五入。

另请参阅 Spring 引导配置属性功能,您可以在其中为 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