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
This commit is contained in:
Oleg Zhurakousky
2025-04-02 16:02:55 +02:00
parent a354046acf
commit 7dd7d64e97
2 changed files with 20 additions and 6 deletions

View File

@@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -34,6 +34,19 @@ public interface MessageConverterHelper {
return false; 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. * 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. * It provides a place for providing post-processing logic before message converter returns.

View File

@@ -81,9 +81,10 @@ public class SmartCompositeMessageConverter extends CompositeMessageConverter {
if (logger.isWarnEnabled()) { if (logger.isWarnEnabled()) {
logger.warn("Failure during type conversion by " + converter + ". Will try the next converter.", e); 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; return null;
} }
@@ -122,7 +123,7 @@ public class SmartCompositeMessageConverter extends CompositeMessageConverter {
} }
if (!isConverted) { if (!isConverted) {
this.postProcessBatchMessage(message, messageConverterHelpers, resultList.size()); this.postProcessBatchMessage(message, messageConverterHelpers, resultList.size());
this.failConversionIfNecessary(message, messageConverterHelpers); this.failConversionIfNecessary(message, messageConverterHelpers, null);
} }
} }
return resultList; return resultList;
@@ -139,13 +140,13 @@ public class SmartCompositeMessageConverter extends CompositeMessageConverter {
} }
} }
} }
this.failConversionIfNecessary(message, messageConverterHelpers); this.failConversionIfNecessary(message, messageConverterHelpers, null);
return result; return result;
} }
private void failConversionIfNecessary(Message<?> message, Collection<MessageConverterHelper> messageConverterHelpers) { private void failConversionIfNecessary(Message<?> message, Collection<MessageConverterHelper> messageConverterHelpers, Throwable t) {
for (MessageConverterHelper messageConverterHelper : messageConverterHelpers) { for (MessageConverterHelper messageConverterHelper : messageConverterHelpers) {
if (messageConverterHelper.shouldFailIfCantConvert(message)) { if (messageConverterHelper.shouldFailIfCantConvert(message, t)) {
throw new MessageConversionException("Failed to convert Message: " + message throw new MessageConversionException("Failed to convert Message: " + message
+ ". None of the available Message converters were able to convert this Message"); + ". None of the available Message converters were able to convert this Message");
} }