Spring Boot | spring EL использует значение атрибута аннотации для установки любого случайного значения с помощью свойств

#spring-boot #java-8 #spring-kafka #spring-el

#spring-boot #java-8 #spring-кафка #spring-el

Вопрос:

Я использую одну существующую аннотацию spring boot и хочу динамически устанавливать значение атрибута с помощью spring expression и хочу иметь одно постоянное значение в качестве префикса,

пример фрагмента кода

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

Я хочу создать новую группу потребителей для каждого нового контейнера, используя вышеуказанную реализацию.

Но я сталкиваюсь с приведенным ниже исключением.

Сбой синтаксического анализа выражения; вложенным исключением является исключение org.springframework.expression.spel.SpelParseException: EL1041E: после синтаксического анализа допустимого выражения в выражении остается еще больше данных: ‘lparen(()

пожалуйста, помогите мне использовать шаблон spring EL или любой другой способ, который я могу использовать для установки идентификатора динамической группы потребителей с постоянным префиксом.

Комментарии:

1. Вам не хватает закрытия } .

2. @M.Deinum Я добавил в свой фрагмент кода, но пропустил добавление здесь, о котором идет речь, не могли бы вы проверить сейчас.

3. Если кто-либо хочет поставить отрицательные оценки только потому, что они не понимают, пожалуйста, дайте мне знать, я исправлю их.

4. AFAIK, вам также нужно префикс статического вызова с T чем-то вроде (int) T(java.lang.Math).random() . Я не думаю, что это сработало бы иначе.

5. Смотрите Также мой ответ.

Ответ №1:

 groupId="#{'consumergroup'   (100 * T(Math).random()).intValue() }"
 
  1. В SpEL нет cast оператора. Просто потому, что он использует a ConversionService внутренне для преобразования из одного типа в другой. Я использую intValue() любой способ, потому что результат random() is Double (not double ) — SpEL выполняет принудительное преобразование в оболочки типов для удобства API.
  2. java.lang Автоматически импортируется в контекст SpEL. Нет необходимости добавлять его для Math типа.
  3. 100 * . Смотрите Math.random() JavaDocs: он возвращает значение между 0.0 и 1.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