У меня есть класс, который моделирует пользователя, и другой, который моделирует его страну. Примерно так:
public class User{
private Country country;
//other attributes and getter/setters
}
public class Country{
private Integer id;
private String name;
//other attributes and getter/setters
}
У меня есть форма Spring, где у меня есть поле со списком, чтобы пользователь мог выбрать свою страну или выбрать неопределенную опцию, чтобы указать, что он не хочет предоставлять эту информацию. Итак, у меня есть что-то вроде этого:
<form:select path="country">
<form:option value="">-Select one-</form:option>
<form:options items="${countries}" itemLabel="name" itemValue="id"/>
</form:select>
В моем контроллере я получаю автоматически заполненный объект с пользовательской информацией, и я хочу, чтобы страна была установлена на ноль, когда была выбрана опция "-Select one-". Поэтому я установил initBinder с помощью специального редактора, например так:
@InitBinder
protected void initBinder(WebDataBinder binder) throws ServletException {
binder.registerCustomEditor(Country.class, "country", new CustomCountryEditor());
}
и мой редактор делает что-то вроде этого:
public class CustomCountryEditor(){
@Override
public String getAsText() {
//I return the Id of the country
}
@Override
public void setAsText(String str) {
//I search in the database for a country with id = new Integer(str)
//and set country to that value
//or I set country to null in case str == null
}
}
Когда я отправляю форму, она работает, потому что, когда у меня есть страна, равная нулю, когда я выбрал
Опция «-Выбрать один» или экземпляр выбранной страны. Проблема в том, что когда я загружаю форму, у меня появляется метод, подобный следующему, для загрузки информации о пользователе.
@ModelAttribute("user")
public User getUser(){
//loads user from database
}
В объекте, который я получаю из getUser (), для страны задана определенная страна (не нулевое значение), но в выпадающем списке не выбран ни один параметр. Я отладил приложение, и CustomCountryEditor хорошо работает при установке и получении текста, хотя метод getAsText вызывается для каждого элемента в списке «страны», а не только для поля «страна».
Есть идеи?
Есть ли лучший способ установить нулевой объект страны, когда в поле со списком не выбран параметр страны?
Спасибо