सभी के लिए धन्यवाद (और विशेष रूप से एस्पेन जो मुझे वसंत के भीतर विभिन्न विकल्पों को दिखाने के लिए बहुत प्रयास किए गए थे)।
अंत में, मुझे एक समाधान मिला जो स्प्रिंग कॉन्फ़िगरेशन की आवश्यकता नहीं है।
मैंने स्टीफन सी के लिंक का पालन किया और फिर थ्रेड के उस सेट के भीतर SimpleBeanInfo कक्षा का संदर्भ पाया। यह वर्ग किसी उपयोगकर्ता को एक ही कक्षा में एक ही कक्षा में रखकर गैर-मानक सेटर्स/गेटर्स के साथ कक्षा नाम पर संलग्न 'बीनइन्फो' के तर्क को ओवरराइड करने और 'बीनइन्फो' को लागू करने के लिए अपने स्वयं के बीन विधि संकल्प कोड लिखने की अनुमति देता है। ' इंटरफेस।
मैंने फिर Google पर एक खोज की और इसे blog पाया जिसने मार्ग की ओर इशारा किया। ब्लॉग पर समाधान काफी बुनियादी था इसलिए मैंने इसे अपने उद्देश्यों के लिए बाहर निकाला।
प्रति वर्ग (साथ धाराप्रवाह setters)
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);
}
}
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;
}
लाभ इस दृष्टिकोण के लिए:
- कोई कस्टम वसंत विन्यास नहीं (वसंत गैर-मानक सेटर्स से अवगत नहीं है और उन्हें सामान्य के रूप में देखता है)। किसी भी वसंत .jar फ़ाइलों पर निर्भरता नहीं है लेकिन वसंत से सुलभ है।
- बस काम करना प्रतीत होता है। इस दृष्टिकोण को
नुकसान:
- मैं गैर मानक setters के साथ अपने एपीआई वर्गों में से सभी के लिए एक BeanInfo वर्ग बनाने रखना होगा। सौभाग्य से केवल 10 ऐसे वर्ग हैं और विधि संकल्प तर्क को एक अलग वर्ग में ले जाकर मेरे पास केवल एक ही स्थान है।
समापन विचार
मेरी राय में, वसंत धाराप्रवाह setters से निपटने के मूल रूप से, वे किसी को भी चोट नहीं है चाहिए और यह सिर्फ वापसी मान अनदेखा कर देना चाहिए।
उन सेटर्स को कठोर रूप से शून्य होने की आवश्यकता के कारण, मुझे मुझे अन्य बॉयलर प्लेट कोड लिखने के लिए मजबूर कर दिया गया है, जो मुझे अन्यथा चाहिए था। मैं बीन विशिष्टता की सराहना करता हूं, लेकिन बीन रिज़ॉल्यूशन मानक बीन रिज़ॉल्वर का उपयोग किए बिना प्रतिबिंब का उपयोग करके तुच्छ है, इसलिए वसंत को अपने स्वयं के बीन रिज़ॉल्वर का विकल्प प्रदान करना चाहिए जो इस परिस्थितियों को संभालेगा।
हर तरह से, मानक तंत्र को डिफ़ॉल्ट के रूप में छोड़ दें, लेकिन एक-लाइन कॉन्फ़िगरेशन विकल्प प्रदान करें। मैं भविष्य के संस्करणों की प्रतीक्षा करता हूं जहां यह वैकल्पिक रूप से आराम से हो सकता है।
यह वास्तव में कुछ हद तक दिलचस्प विचार है। – alternative