This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new 0ff84a244d9 CAMEL-19234: Lookup beans by name+type first, and fallback to name-and-convert, when resolving endpoint URI beans. (#9811) 0ff84a244d9 is described below commit 0ff84a244d91b58cc007ac969ff88366e1c09b6e Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Wed Apr 5 06:58:54 2023 +0200 CAMEL-19234: Lookup beans by name+type first, and fallback to name-and-convert, when resolving endpoint URI beans. (#9811) --- .../org/apache/camel/support/EndpointHelper.java | 44 ++++++++++++---------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java index 280022165aa..c37820caa3f 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java @@ -310,23 +310,17 @@ public final class EndpointHelper { * @throws NoSuchBeanException if object was not found in registry and <code>mandatory</code> is <code>true</code>. */ public static <T> T resolveReferenceParameter(CamelContext context, String value, Class<T> type, boolean mandatory) { + Object answer = null; if (value.startsWith("#class:")) { - Object answer; try { answer = createBean(context, value, type); } catch (Exception e) { throw new NoSuchBeanException(value, e); } - if (mandatory && answer == null) { - throw new NoSuchBeanException(value); - } - return type.cast(answer); } else if (value.startsWith("#type:")) { try { - Object answer = null; - - String valueNoHash = value.substring(6); - Class<?> clazz = context.getClassResolver().resolveMandatoryClass(valueNoHash); + value = value.substring(6); + Class<?> clazz = context.getClassResolver().resolveMandatoryClass(value); Set<?> set = context.getRegistry().findByType(clazz); if (set.size() == 1) { answer = set.iterator().next(); @@ -334,25 +328,35 @@ public final class EndpointHelper { throw new NoSuchBeanException( value, "Found " + set.size() + " beans of type: " + clazz + ". Only 1 bean instance is supported."); } - if (mandatory && answer == null) { - throw new NoSuchBeanException(value); - } - if (answer != null) { - answer = context.getTypeConverter().convertTo(type, answer); - } - return type.cast(answer); } catch (ClassNotFoundException e) { throw new NoSuchBeanException(value, e); } } else { - String valueNoHash = value.replace("#bean:", ""); - valueNoHash = valueNoHash.replace("#", ""); + value = value.replace("#bean:", ""); + value = value.replace("#", ""); + // lookup first with type + answer = CamelContextHelper.lookup(context, value, type); + if (answer == null) { + // fallback to lookup by name + answer = CamelContextHelper.lookup(context, value); + } + } + + if (mandatory && answer == null) { + if (type != null) { + throw new NoSuchBeanException(value, type.getTypeName()); + } else { + throw new NoSuchBeanException(value); + } + } + if (answer != null) { if (mandatory) { - return CamelContextHelper.mandatoryLookupAndConvert(context, valueNoHash, type); + answer = CamelContextHelper.convertTo(context, type, answer); } else { - return CamelContextHelper.lookupAndConvert(context, valueNoHash, type); + answer = CamelContextHelper.tryConvertTo(context, type, answer); } } + return (T) answer; } private static <T> T createBean(CamelContext camelContext, String name, Class<T> type) throws Exception {