diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index 5ac3ff1f50e..5a9c12a47d7 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -337,6 +337,8 @@ Other Changes * SOLR-9110: Move JoinFromCollection- SubQueryTransformer- BlockJoinFacet- Distrib Tests to SolrCloudTestCase (Mikhail Khludnev) +* SOLR-9161: SolrPluginUtils.invokeSetters now accommodates setter variants (Christine Poerschke) + ================== 6.0.1 ================== (No Changes) diff --git a/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java b/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java index b30cc06ba5e..33c108d3b90 100644 --- a/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java +++ b/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java @@ -1066,8 +1066,8 @@ public class SolrPluginUtils { String key = entry.getKey(); String setterName = "set" + String.valueOf(Character.toUpperCase(key.charAt(0))) + key.substring(1); try { - final Method method = findSetter(clazz, setterName, key); final Object val = entry.getValue(); + final Method method = findSetter(clazz, setterName, key, val.getClass()); method.invoke(bean, val); } catch (InvocationTargetException | IllegalAccessException e1) { throw new RuntimeException("Error invoking setter " + setterName + " on class : " + clazz.getName(), e1); @@ -1075,10 +1075,14 @@ public class SolrPluginUtils { } } - private static Method findSetter(Class clazz, String setterName, String key) { - for (Method m : clazz.getMethods()) { - if (m.getName().equals(setterName) && m.getParameterTypes().length == 1) { - return m; + private static Method findSetter(Class clazz, String setterName, String key, Class paramClazz) { + try { + return clazz.getMethod(setterName, new Class[] { paramClazz }); + } catch (NoSuchMethodException e) { + for (Method m : clazz.getMethods()) { + if (m.getName().equals(setterName) && m.getParameterTypes().length == 1) { + return m; + } } } throw new RuntimeException("No setter corrresponding to '" + key + "' in " + clazz.getName()); diff --git a/solr/core/src/test/org/apache/solr/util/SolrPluginUtilsTest.java b/solr/core/src/test/org/apache/solr/util/SolrPluginUtilsTest.java index 33e9291c703..fc506807630 100644 --- a/solr/core/src/test/org/apache/solr/util/SolrPluginUtilsTest.java +++ b/solr/core/src/test/org/apache/solr/util/SolrPluginUtilsTest.java @@ -455,6 +455,34 @@ public class SolrPluginUtilsTest extends SolrTestCaseJ4 { assertEquals(3, q.build().getMinimumNumberShouldMatch()); } + private class InvokeSettersTestClass { + private float aFloat = random().nextFloat(); + public float getAFloat() { + return aFloat; + } + public void setAFloat(float aFloat) { + this.aFloat = aFloat; + } + public void setAFloat(String aFloat) { + this.aFloat = Float.parseFloat(aFloat); + } + } + + @Test + public void testInvokeSetters() { + final Float theFloat = new Float(random().nextFloat()); + implTestInvokeSetters(theFloat, theFloat); + implTestInvokeSetters(theFloat, theFloat.toString()); + } + + public void implTestInvokeSetters(final Float theFloat, final Object theFloatObject) { + final InvokeSettersTestClass bean = new InvokeSettersTestClass(); + final Map initArgs = new HashMap<>(); + initArgs.put("aFloat", theFloatObject); + SolrPluginUtils.invokeSetters(bean, initArgs.entrySet()); + assertEquals(bean.getAFloat(), theFloat.floatValue(), 0.0); + } + /** macro */ public String pe(CharSequence s) { return SolrPluginUtils.partialEscape(s).toString();