मैं स्प्रिंग एमवीसी में डेटा को बाँधने और परिवर्तित करने का सबसे आसान और सरल तरीका ढूंढ रहा हूं। यदि संभव हो तो, बिना किसी xml कॉन्फ़िगरेशन के।
अब तक मैं PropertyEditors का उपयोग कर रहा हूँ जैसे:
public class CategoryEditor extends PropertyEditorSupport {
// Converts a String to a Category (when submitting form)
@Override
public void setAsText(String text) {
Category c = new Category(text);
this.setValue(c);
}
// Converts a Category to a String (when displaying form)
@Override
public String getAsText() {
Category c = (Category) this.getValue();
return c.getName();
}
}
तथा
...
public class MyController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Category.class, new CategoryEditor());
}
...
}
यह सरल है: दोनों रूपांतरण एक ही कक्षा में परिभाषित किए गए हैं, और बंधन सीधा है। अगर मैं अपने सभी नियंत्रकों के साथ एक सामान्य बाइंडिंग करना चाहता था, तो भी मैं अपने xml कॉन्फिगर में 3 लाइनें जोड़ सकता था ।
लेकिन स्प्रिंग 3.x ने कन्वर्टर्स का उपयोग करते हुए इसे करने का एक नया तरीका पेश किया :
स्प्रिंग कंटेनर के भीतर, इस प्रणाली को प्रॉपर्टी एडिटर्स के विकल्प के रूप में इस्तेमाल किया जा सकता है
तो मान लें कि मैं कन्वर्टर्स का उपयोग करना चाहता हूं क्योंकि यह "नवीनतम विकल्प" है। मुझे दो कन्वर्टर्स बनाने होंगे :
public class StringToCategory implements Converter<String, Category> {
@Override
public Category convert(String source) {
Category c = new Category(source);
return c;
}
}
public class CategoryToString implements Converter<Category, String> {
@Override
public String convert(Category source) {
return source.getName();
}
}
पहली खामी: मुझे दो कक्षाएं करनी हैं। लाभ: उदारता के लिए धन्यवाद देने की आवश्यकता नहीं है।
फिर, मैं डेटा को केवल कन्वर्टर्स से कैसे बांध सकता हूं?
दूसरी खामी: मैंने इसे किसी कंट्रोलर में करने के लिए कोई सरल तरीका (एनोटेशन या अन्य प्रोग्रामेटिक सुविधाएं) नहीं पाया है: ऐसा कुछ भी नहीं someSpringObject.registerCustomConverter(...);
।
मेरे द्वारा पाया गया एकमात्र तरीका थकाऊ होगा, सरल नहीं, और केवल सामान्य क्रॉस-कंट्रोलर बाइंडिंग के बारे में:
-
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="somepackage.StringToCategory"/> <bean class="somepackage.CategoryToString"/> </set> </property> </bean>
जावा कॉन्फिग ( केवल स्प्रिंग 3.1+ में ):
@EnableWebMvc @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override protected void addFormatters(FormatterRegistry registry) { registry.addConverter(new StringToCategory()); registry.addConverter(new CategoryToString()); } }
इन सभी कमियों के साथ, कन्वर्टर्स का उपयोग क्यों करें? क्या मैं कुछ भूल रहा हूँ ? क्या अन्य चालें हैं जिनके बारे में मुझे जानकारी नहीं है?
मुझे प्रॉपर्टी एडिटर्स का उपयोग करने के लिए लुभाया जाता है ... बाइंडिंग बहुत आसान और तेज है।