2012-10-13 10 views
12

Ho un modello che contiene un elenco di Paesi (Elenco) e un oggetto utente che contiene un oggetto Paese. Ho la visione che l'utente può selezionare il suo paese.
Questo è frammento della mia pagina jsp:modulo mvc di primavera: selezionare il tag

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

Questo è il mio modello di account:

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

Quando i carichi jsp (GET) il modulo: selezionare visualizza l'elemento selezionato dell'utente corrente nazione. Il problema è che quando invio il modulo ottengo questa eccezione:

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] 

Qualche idea su come posso superare questo?

risposta

7

È necessario in qualche modo dire a Spring di convertire un String in un Country. Ecco un esempio:

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

} 

e

... 
public class MyController { 

    private @Autowired CountryEditor countryEditor; 

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

    ... 

} 
+0

Grazie - Che ha fatto il trucco. Una cosa che non capisco ancora. se avevo bisogno di un convertitore personalizzato durante la pubblicazione dei dati, perché non ne avevo bisogno quando ricevevo i dati? (quando la pagina è stata caricata, il paese selezionato era lo stesso oggetto del paese dell'utente) –

+0

@MrT. Spring MVC gestisce abilmente le forme 'select'. Il tuo 'form: select' ha' path = "user.country" '. Quindi se l'utente ha già un paese con id 42, il tag opzione con valore 42 avrà un attributo 'selected =" selected "'. Per ulteriori informazioni, [controlla la documentazione sul tag select (clicca qui)] (http://static.springsource.org/spring/docs/current/spring-framework-reference/html/view.html#view-jsp-formtaglib -selecttag). –

+0

Fantastico! L'uomo che ha funzionato perfettamente, mi piacerebbe capire di più come funziona. – Gemasoft

Problemi correlati