Ошибка канала JMS интеграции Spring - SpelEvaluationException: EL1078E

Недавно я обновил свое приложение Spring Boot с Spring 5 до Spring 6 вместе с другими jar-файлами зависимостей.

Приложение использует интеграцию Spring для получения сообщений из очереди и их обработки с помощью других последующих систем.

После обновления начал видеть ошибку ниже:

Caused by: org.springframework.expression.spel.**SpelEvaluationException**: **EL1078E: Concatenated string is too long, exceeding the threshold of '100,000' characters** at org.springframework.expression.spel.ast.OpPlus.checkStringLength(OpPlus.java:158)

Судя по ошибке, интеграция Spring не может принимать сообщения длиной более 100 тыс. символов, приложение могло обрабатывать сообщения этого размера перед обновлением версии.

Я пытался узнать эту предельную длину, и похоже, что она жестко запрограммирована весной -

https://github.com/spring-projects/spring-framework/blob/73d30dd875affac7dc69232bf4c6b183e0801c26/spring-expression/src/main/java/org/springframework/expression/spel/ast/OpPlus.java#L58

Кто-нибудь знает, есть ли другой способ исправить эту ошибку?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
1
0
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не вижу такого свойства для настройки этого ограничения. Это действительно жестко запрограммировано в OpPlus. Проблема не в обновлении версии Java, а в том, что вы обновили Spring Framework с какой-то старой версии. См. Javadocon, который OpPlus.MAX_CONCATENATED_STRING_LENGTH.

Кроме того, проблема не в упомянутом <int-jms:message-driven-channel-adapter>, а скорее где-то ниже, где вы делаете такую ​​огромную конкатенацию в SpEL.

Подумайте о том, чтобы переместить эту логику в вызов метода Java, если вам действительно нужно выполнить эту конкатенацию.

Да, я знаю, что весной эта проверка была введена в версии 5.2.24. Проблема в том, что приложение использует некоторые функции Spring, которые зависят от базовой версии Spring, например языка выражений (SpEL). Я только что обновил приложение с Spring 5.2.0 до 6.1.5 вместе с обновлением версии Spring Boot. Не уверен, стоит ли мне сообщать об ошибке в весеннем проекте GitHub. Приложение в значительной степени полагается на интеграцию Spring для чтения сообщений из очереди JMS, а затем обработки их с помощью другого нижестоящего канала интеграции. Перенос всего этого в Java невозможен, учитывая, что проблема связана с Spring Framework.

Oblivious_s 18.06.2024 02:53

Надеемся, что в контексте приложения Spring будет какое-то свойство Spring, которое сможет переопределить эту логику, подобную этой: Spring.context.expression.maxLength docs.spring.io/spring-framework/reference/core/expressions/…

Oblivious_s 18.06.2024 02:53

Я не уверен, почему вы считаете это проблемой, поскольку, вероятно, это было сделано для устранения некоторой уязвимости SpEL. Я не хотел переносить все на Java: только ту часть выражения, где вы делаете такую ​​огромную конкатенацию. Вместо этого вы можете просто использовать bean-компонент с каким-то конкретным методом, который будет вызываться из этого выражения: docs.spring.io/spring-framework/reference/core/expressions/…

Artem Bilan 18.06.2024 16:08

Спасибо @Artem Bilan за руководство в правильном направлении, проблема была в адаптере канала регистрации Spring-Integration, который поглощал весь атрибут полезной нагрузки в выражение. И эта новая версия Spring-выражения не допускает символов, превышающих 100 000.

Oblivious_s 19.06.2024 07:51

Другие вопросы по теме

Похожие вопросы

Почему мое приложение Java Spring выходит из строя, если я запускаю его с флагами «-XDebug» и «-Xrunjdwp» одновременно?
Проблема с превышением максимального токена в Azure OpenAI (с Java)
Spring безопасность 6 - авторизация не работает
Невозможно имитировать bean-компонент RestClient при тестировании класса, использующего этот bean-компонент
ОШИБКА o.h.e.jdbc.spi.SqlExceptionHelper — ОШИБКА: синтаксическая ошибка на месте «:» или рядом с ним при использовании @Query
Как запустить приложение Spring Boot с распакованными зависимостями?
Существуют ли такие инструменты, как Jqwik, для простого тестирования класса времени Google API? (DateTime, EventDateTime... и т. д.)
Mockito выдает ошибку. Несоответствие аргументов строгой заглушки
Как настроить повторные попытки для неудачных событий приложения Spring, сохраненных в репозитории публикаций событий Spring Modulith?
Java.lang.NoClassDefFoundError: jakarta/servlet/SingleThreadModel — ошибка при использовании apache spark 4.0-preview1