From 017db7d686447fd91e328eda9984a576bd6d34ab Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Wed, 2 Apr 2025 16:02:55 +0200 Subject: [PATCH] GH-1234 Change the point where 'failConversionIfNecessary' is called I have also added a new method to MessageConverterHelper.shouldFailIfCantConvert(Message message, Throwable t) to include Throwable and changed the callback in SmartCompositeMessageConverter to ensure it passes it in case it needs to be taken into account. Resolves #1234 --- .../context/config/MessageConverterHelper.java | 15 ++++++++++++++- .../config/SmartCompositeMessageConverter.java | 11 ++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/MessageConverterHelper.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/MessageConverterHelper.java index cedb81a61..ab6d0676a 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/MessageConverterHelper.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/MessageConverterHelper.java @@ -1,5 +1,5 @@ /* - * Copyright 2015-2021 the original author or authors. + * Copyright 2015-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,6 +34,19 @@ public interface MessageConverterHelper { return false; } + + /** + * This method will be called by the framework in cases when a message failed to convert. + * It allows you to signal to the framework if such failure should be considered fatal or not. + * + * @param message failed message + * @param t exception (coudl be null) + * @return true if conversion failure must be considered fatal. + */ + default boolean shouldFailIfCantConvert(Message message, Throwable t) { + return false; + } + /** * This method will be called by the framework in cases when a single message within batch of messages failed to convert. * It provides a place for providing post-processing logic before message converter returns. diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/SmartCompositeMessageConverter.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/SmartCompositeMessageConverter.java index 22730d1ec..65d3deafb 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/SmartCompositeMessageConverter.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/SmartCompositeMessageConverter.java @@ -81,9 +81,10 @@ public class SmartCompositeMessageConverter extends CompositeMessageConverter { if (logger.isWarnEnabled()) { logger.warn("Failure during type conversion by " + converter + ". Will try the next converter.", e); } + this.failConversionIfNecessary(message, messageConverterHelpers, e); } } - this.failConversionIfNecessary(message, messageConverterHelpers); + return null; } @@ -122,7 +123,7 @@ public class SmartCompositeMessageConverter extends CompositeMessageConverter { } if (!isConverted) { this.postProcessBatchMessage(message, messageConverterHelpers, resultList.size()); - this.failConversionIfNecessary(message, messageConverterHelpers); + this.failConversionIfNecessary(message, messageConverterHelpers, null); } } return resultList; @@ -139,13 +140,13 @@ public class SmartCompositeMessageConverter extends CompositeMessageConverter { } } } - this.failConversionIfNecessary(message, messageConverterHelpers); + this.failConversionIfNecessary(message, messageConverterHelpers, null); return result; } - private void failConversionIfNecessary(Message message, Collection messageConverterHelpers) { + private void failConversionIfNecessary(Message message, Collection messageConverterHelpers, Throwable t) { for (MessageConverterHelper messageConverterHelper : messageConverterHelpers) { - if (messageConverterHelper.shouldFailIfCantConvert(message)) { + if (messageConverterHelper.shouldFailIfCantConvert(message, t)) { throw new MessageConversionException("Failed to convert Message: " + message + ". None of the available Message converters were able to convert this Message"); }