Gracias a todos (y especialmente a Espen que hizo un gran esfuerzo para mostrarme las diversas opciones dentro de Spring).
Al final, he encontrado una solución a mí mismo que no requiere configuración de la primavera.
I seguido el enlace de Stephen C entonces encontró una referencia a la clase SimpleBeanInfo dentro de ese conjunto de hilos. Esta clase permite a un usuario escribir su propio código de resolución de método de bean mediante la colocación de otra clase en el mismo paquete que la clase con los fijadores no estándar/getters para anular la lógica de con 'BeanInfo' anexado en el nombre de clase y la aplicación de la 'BeanInfo ' interfaz.
luego hice una búsqueda en Google y encontré este blog el que señaló el camino. La solución en el blog era bastante básica, así que la completé para mis propósitos.
por clase (con emisores de fluidez)
public class MyComponentBeanInfo<T> extends SimpleBeanInfo {
private final static Class<?> _clazz = MyComponent.class;
PropertyDescriptor[] _properties = null;
public synchronized PropertyDescriptor[] getPropertyDescriptors() {
if (_properties == null) {
_properties = Helpers.getPropertyDescriptionsIncludingFluentSetters(_clazz);
}
return _properties;
}
public BeanDescriptor getBeanDescriptor() {
return new BeanDescriptor(_clazz);
}
}
método de generación de PropertyDescriptor
public static PropertyDescriptor[] getPropertyDescriptionsIncludingFluentSetters(Class<?> clazz) {
Map<String,Method> getterMethodMap = new HashMap<String,Method>();
Map<String,Method> setterMethodMap = new HashMap<String,Method>();
Set<String> allProperties = new HashSet<String>();
PropertyDescriptor[] properties = null;
try {
Method[] methods = clazz.getMethods();
for (Method m : methods) {
String name = m.getName();
boolean isSetter = m.getParameterTypes().length == 1 && name.length() > 3 && name.substring(0,3).equals("set") && name.charAt(3) >= 'A' && name.charAt(3) <= 'Z';
boolean isGetter = (!isSetter) && m.getParameterTypes().length == 0 && name.length() > 3 && name.substring(0,3).equals("get") && name.charAt(3) >= 'A' && name.charAt(3) <= 'Z';
if (isSetter || isGetter) {
name = name.substring(3);
name = name.length() > 1
? name.substring(0,1).toLowerCase() + name.substring(1)
: name.toLowerCase();
if (isSetter) {
setterMethodMap.put(name, m);
} else {
getterMethodMap.put(name, m);
}
allProperties.add(name);
}
}
properties = new PropertyDescriptor[allProperties.size()];
Iterator<String> iterator = allProperties.iterator();
for (int i=0; i < allProperties.size(); i++) {
String propertyName = iterator.next();
Method readMethod = getterMethodMap.get(propertyName);
Method writeMethod = setterMethodMap.get(propertyName);
properties[i] = new PropertyDescriptor(propertyName, readMethod, writeMethod);
}
} catch (IntrospectionException e) {
throw new RuntimeException(e.toString(), e);
}
return properties;
}
ventajas de este enfoque:
- Sin configuración personalizada de muelles (Spring no tiene conocimiento de los incubadores no estándar y los considera normales). No depende de ningún archivo .jar de Spring pero accesible desde Spring.
- Parece que funciona.
Las desventajas de este enfoque:
- tengo que colocar crear una clase BeanInfo para todas mis clases de la API con los emisores no estándar. Afortunadamente solo hay alrededor de 10 de estas clases y al mover la lógica de resolución de métodos a una clase separada, solo tengo un lugar para mantener.
Pensamientos finales
En mi opinión, Primavera debería hacer frente a los emisores con fluidez nativa, que no hacen daño a nadie y que sólo se debe pasar por alto el valor de retorno.
Al requerir que los colocadores sean rígidamente nulos, me ha obligado a escribir mucho más código de placa de caldera de lo que hubiera necesitado de otra manera. Aprecio la especificación de frijol, pero la resolución de frijol es trivial usando la reflexión sin siquiera usar el resolutor de frijol estándar, por lo que Spring debería ofrecer la opción de su propio solucionador de frijol que manejará estas situaciones.
Por supuesto, deje el mecanismo estándar como predeterminado, pero ofrezca una opción de configuración de una línea. Espero con ansias futuras versiones donde esto podría ser opcionalmente relajado.
Esa es en realidad una idea algo interesante. – alternative