Недавно я обновил свое приложение 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 тыс. символов, приложение могло обрабатывать сообщения этого размера перед обновлением версии.
Я пытался узнать эту предельную длину, и похоже, что она жестко запрограммирована весной -
Кто-нибудь знает, есть ли другой способ исправить эту ошибку?




Я не вижу такого свойства для настройки этого ограничения. Это действительно жестко запрограммировано в OpPlus. Проблема не в обновлении версии Java, а в том, что вы обновили Spring Framework с какой-то старой версии. См. Javadocon, который OpPlus.MAX_CONCATENATED_STRING_LENGTH.
Кроме того, проблема не в упомянутом <int-jms:message-driven-channel-adapter>, а скорее где-то ниже, где вы делаете такую огромную конкатенацию в SpEL.
Подумайте о том, чтобы переместить эту логику в вызов метода Java, если вам действительно нужно выполнить эту конкатенацию.
Надеемся, что в контексте приложения Spring будет какое-то свойство Spring, которое сможет переопределить эту логику, подобную этой: Spring.context.expression.maxLength docs.spring.io/spring-framework/reference/core/expressions/…
Я не уверен, почему вы считаете это проблемой, поскольку, вероятно, это было сделано для устранения некоторой уязвимости SpEL. Я не хотел переносить все на Java: только ту часть выражения, где вы делаете такую огромную конкатенацию. Вместо этого вы можете просто использовать bean-компонент с каким-то конкретным методом, который будет вызываться из этого выражения: docs.spring.io/spring-framework/reference/core/expressions/…
Спасибо @Artem Bilan за руководство в правильном направлении, проблема была в адаптере канала регистрации Spring-Integration, который поглощал весь атрибут полезной нагрузки в выражение. И эта новая версия Spring-выражения не допускает символов, превышающих 100 000.
Да, я знаю, что весной эта проверка была введена в версии 5.2.24. Проблема в том, что приложение использует некоторые функции Spring, которые зависят от базовой версии Spring, например языка выражений (SpEL). Я только что обновил приложение с Spring 5.2.0 до 6.1.5 вместе с обновлением версии Spring Boot. Не уверен, стоит ли мне сообщать об ошибке в весеннем проекте GitHub. Приложение в значительной степени полагается на интеграцию Spring для чтения сообщений из очереди JMS, а затем обработки их с помощью другого нижестоящего канала интеграции. Перенос всего этого в Java невозможен, учитывая, что проблема связана с Spring Framework.