2012-10-13 10 views
12

Ich habe ein Modell, das eine Liste der Länder (Liste) und ein Benutzerobjekt enthält, das ein Land-Objekt enthält. Ich bin der Ansicht, dass der Benutzer sein Land auswählen kann.
Dies ist Schnipsel meiner jsp Seite:Feder-Mvc-Formular: Tag auswählen

<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> 

Das ist mein Konto Modell:

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; 
    } 
} 

Wenn die jsp Lasten (GET) die Form: select zeigt das ausgewählte Element des aktuellen Benutzers Land. Das Problem ist, dass wenn ich das Formular poste ich diese Ausnahme bekomme:

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] 

Irgendeine Idee, wie ich das überwinden kann?

Antwort

7

Sie müssen Spring eine String in eine Country konvertieren. Hier ein Beispiel:

@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); 
    } 

} 

und

... 
public class MyController { 

    private @Autowired CountryEditor countryEditor; 

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

    ... 

} 
+0

Dank - das ist der Trick. Eine Sache, die ich noch nicht verstehe. wenn ich beim posten der daten einen kundenspezifischen konverter brauchte, warum brauchte ich nicht einen, wenn ich die daten bekomme? (Wenn die Seite geladen wurde, war das ausgewählte Land das gleiche Länderobjekt wie der Benutzer) –

+0

@MrT. Spring MVC handhabt "Select" Formen geschickt. Ihre 'Form: select' hat' path = "user.country" '. Wenn der Benutzer also bereits ein Land mit der ID 42 hat, hat das Optionsfeld mit dem Wert 42 ein Attribut "selected =" selected "". Weitere Informationen finden Sie in der Dokumentation zum Tag (hier klicken)] (http://static.springsource.org/spring/docs/current/spring-framework-reference/html/view.html#view-jsp-formtaglib -Auswahltag). –

+0

Super! Mann, der perfekt funktioniert hat, würde ich gerne mehr darüber verstehen, wie das funktioniert. – Gemasoft

Verwandte Themen