diff --git a/core/src/main/java/com/opensymphony/xwork2/conversion/annotations/TypeConversion.java b/core/src/main/java/com/opensymphony/xwork2/conversion/annotations/TypeConversion.java index 8039f97bb..6c86d4a6d 100644 --- a/core/src/main/java/com/opensymphony/xwork2/conversion/annotations/TypeConversion.java +++ b/core/src/main/java/com/opensymphony/xwork2/conversion/annotations/TypeConversion.java @@ -82,15 +82,15 @@ import java.lang.annotation.Target; * * * converter - * DEPRECATED: either this or value + * either this or value *   - * The class name of the TypeConverter to be used as converter. + * The class or bean name of the TypeConverter to be used as converter. * * * converterClass * either this or value - *   - * The class of the TypeConverter to be used as converter. XWorkBasicConverter by default. + * XWorkBasicConverter + * The class of the TypeConverter to be used as converter. * * * value @@ -181,14 +181,13 @@ public @interface TypeConversion { ConversionRule rule() default ConversionRule.PROPERTY; /** - * The class of the TypeConverter to be used as converter. + * The class or bean name of the TypeConverter to be used as converter. * * Note: This can not be used with ConversionRule.KEY_PROPERTY! * - * @return class of the TypeConverter to be used as converter - * @deprecated user {@link #converterClass()} instead + * @return class or bean name of the TypeConverter to be used as converter + * @see {@link #converterClass()} */ - @Deprecated String converter() default ""; /** diff --git a/core/src/main/java/com/opensymphony/xwork2/conversion/impl/DefaultConversionAnnotationProcessor.java b/core/src/main/java/com/opensymphony/xwork2/conversion/impl/DefaultConversionAnnotationProcessor.java index 2a3786869..8021f3f92 100644 --- a/core/src/main/java/com/opensymphony/xwork2/conversion/impl/DefaultConversionAnnotationProcessor.java +++ b/core/src/main/java/com/opensymphony/xwork2/conversion/impl/DefaultConversionAnnotationProcessor.java @@ -26,6 +26,7 @@ import com.opensymphony.xwork2.conversion.annotations.ConversionRule; import com.opensymphony.xwork2.conversion.annotations.ConversionType; import com.opensymphony.xwork2.conversion.annotations.TypeConversion; import com.opensymphony.xwork2.inject.Inject; +import com.opensymphony.xwork2.util.ClassLoaderUtil; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -80,18 +81,22 @@ public class DefaultConversionAnnotationProcessor implements ConversionAnnotatio else if (tc.rule() == ConversionRule.KEY) { Class converterClass; if (StringUtils.isNoneEmpty(tc.converter())) { - converterClass = Thread.currentThread().getContextClassLoader().loadClass(tc.converter()); - //check if the converter is a type converter if it is one - //then just put it in the map as is. Otherwise - //put a value in for the type converter of the class + converterClass = ClassLoaderUtil.loadClass(tc.converter(), this.getClass()); } else { converterClass = tc.converterClass(); } LOG.debug("Converter class: [{}]", converterClass); + //check if the converter is a type converter if it is one + //then just put it in the map as is. Otherwise + //put a value in for the type converter of the class if (converterClass.isAssignableFrom(TypeConverter.class)) { - mapping.put(key, converterCreator.createTypeConverter(tc.converter())); + if (StringUtils.isNoneEmpty(tc.converter())) { + mapping.put(key, converterCreator.createTypeConverter(tc.converter())); + } else { + mapping.put(key, converterCreator.createTypeConverter(tc.converterClass())); + } } else { mapping.put(key, converterClass); LOG.debug("Object placed in mapping for key [{}] is [{}]", key, mapping.get(key)); @@ -100,7 +105,7 @@ public class DefaultConversionAnnotationProcessor implements ConversionAnnotatio //elements(values) of maps / lists else { if (StringUtils.isNoneEmpty(tc.converter())) { - mapping.put(key, Thread.currentThread().getContextClassLoader().loadClass(tc.converter())); + mapping.put(key, ClassLoaderUtil.loadClass(tc.converter(), this.getClass())); } else { mapping.put(key, tc.converterClass()); } diff --git a/core/src/main/java/com/opensymphony/xwork2/conversion/impl/DefaultConversionFileProcessor.java b/core/src/main/java/com/opensymphony/xwork2/conversion/impl/DefaultConversionFileProcessor.java index d07cf3cce..7995b7dc3 100644 --- a/core/src/main/java/com/opensymphony/xwork2/conversion/impl/DefaultConversionFileProcessor.java +++ b/core/src/main/java/com/opensymphony/xwork2/conversion/impl/DefaultConversionFileProcessor.java @@ -86,7 +86,7 @@ public class DefaultConversionFileProcessor implements ConversionFileProcessor { //for keys of Maps else if (key.startsWith(DefaultObjectTypeDeterminer.KEY_PREFIX)) { - Class converterClass = Thread.currentThread().getContextClassLoader().loadClass((String) entry.getValue()); + Class converterClass = ClassLoaderUtil.loadClass((String) entry.getValue(), this.getClass()); //check if the converter is a type converter if it is one //then just put it in the map as is. Otherwise @@ -102,7 +102,7 @@ public class DefaultConversionFileProcessor implements ConversionFileProcessor { } //elements(values) of maps / lists else { - Class _c = Thread.currentThread().getContextClassLoader().loadClass((String) entry.getValue()); + Class _c = ClassLoaderUtil.loadClass((String) entry.getValue(), this.getClass()); LOG.debug("\t{}:{} [treated as Class {}]", key, entry.getValue(), _c); mapping.put(key, _c); }