2012-10-13 18 views
12

का चयन करें मेरे पास एक मॉडल है जिसमें देश (सूची) और एक उपयोगकर्ता ऑब्जेक्ट की एक सूची है जिसमें देश वस्तु है। मेरे पास एक विचार है कि उपयोगकर्ता अपने देश का चयन कर सकते हैं।
यह मेरा jsp पेज के स्निपेट है:वसंत एमवीसी फॉर्म: टैग

<form:select path="user.country"> 
    <form:option value="-1">Select your country</form:option> 
    <form:options items="${account.countries}" itemLabel="name" itemValue="id" /> 
</form:select> 

यह मेरा खाता मॉडल है:

public class Account { 

    private User user; 
    private List<Country> countries; 

    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    public List<Country> getCountries() { 
     return countries; 
    } 

    public void setCountries(List<Country> countries) { 
     this.countries = countries; 
    } 
} 

जब jsp भार (जीईटी) फार्म: प्रदर्शित करता है का चयन करें वर्तमान उपयोगकर्ता के चयनित आइटम देश। समस्या यह है कि जब मैं फॉर्म पोस्ट करता हूं तो मुझे यह अपवाद मिलता है:

Field error in object 'account' on field 'user.country': rejected value [90]; 
    codes [typeMismatch.account.user.country,typeMismatch.user.country,typeMismatch.country,typeMismatch.org.MyCompany.entities.Country,typeMismatch]; 
    arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [account.user.country,user.country]; 
    arguments []; default message [user.country]]; 
    default message [Failed to convert property value of type 'java.lang.String' to required type 'org.MyCompany.entities.Country' for property 'user.country'; 
    nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.MyCompany.entities.Country] for property 'country': no matching editors or conversion strategy found] 

कोई विचार यह है कि मैं इसे कैसे दूर कर सकता हूं?

उत्तर

7

आपको किसी भी तरह से String को Country में बदलने के लिए स्प्रिंग को बताना होगा। - यही कारण है कि चाल किया

@Component 
public class CountryEditor extends PropertyEditorSupport { 

    private @Autowired CountryService countryService; 

    // Converts a String to a Country (when submitting form) 
    @Override 
    public void setAsText(String text) { 
     Country c = this.countryService.findById(Long.valueOf(text)); 

     this.setValue(c); 
    } 

} 

है और

... 
public class MyController { 

    private @Autowired CountryEditor countryEditor; 

    @InitBinder 
    public void initBinder(WebDataBinder binder) { 
     binder.registerCustomEditor(Country.class, this.countryEditor); 
    } 

    ... 

} 
+0

धन्यवाद: यहाँ एक उदाहरण है। एक बात मैं अभी तक समझ में नहीं आता। यदि डेटा पोस्ट करते समय मुझे कस्टम कनवर्टर की आवश्यकता होती है, तो डेटा प्राप्त करते समय मुझे एक की आवश्यकता क्यों नहीं थी? (जब पृष्ठ लोड होता है, तो चयनित देश वही देश वस्तु था जैसा उपयोगकर्ता के पास था) –

+0

@MrT। स्प्रिंग एमवीसी चालाकी से 'चयन' रूपों को संभालती है। आपका 'फॉर्म: चुनें' में 'path =" user.country "' है। इसलिए यदि उपयोगकर्ता के पास पहले से 42 वर्ष वाला देश है, तो मूल्य 42 के साथ विकल्प टैग में 'चयनित =' चयनित "विशेषता होगी। अधिक जानकारी के लिए, [चयन टैग के बारे में प्रलेखन देखें (यहां क्लिक करें)] (http://static.springsource.org/spring/docs/current/spring-framework-reference/html/view.html#view-jsp-formtaglib -selecttag)। –

+0

बहुत बढ़िया! वह आदमी जो सिर्फ सही काम करता था, मैं यह समझना चाहता हूं कि यह कैसे काम करता है। – Gemasoft