spring mvc form:select tag

19,241

You need to somehow tell Spring to convert a String to a Country. Here is an example :

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

}

and

...
public class MyController {

    private @Autowired CountryEditor countryEditor;

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

    ...

}
Share:
19,241
Mr T.
Author by

Mr T.

Updated on June 06, 2022

Comments

  • Mr T.
    Mr T. almost 2 years

    I have a Model that holds a list of Countries (List) and a user object that holds a Country object. I have a view that the user can select his country.
    This is snippet of my jsp page:

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

    This is my Account model:

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

    When the jsp loads (GET) the form:select displays the selected item of the current user country. The problem is that when i post the form i get this exception:

    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]
    

    Any idea how i can overcome this?