У меня есть класс, который моделирует пользователя, и другой, который моделирует его страну. Что-то вроде этого:
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, в которой есть поле со списком, чтобы пользователь мог выбрать свою страну или выбрать параметр undefined, чтобы указать, что он не хочет предоставлять эту информацию. Итак, у меня есть что-то вроде этого:
<form:select path="country">
<form:option value="">-Select one-</form:option>
<form:options items="${countries}" itemLabel="name" itemValue="id"/>
</form:select>
В моем контроллере я получаю автоматически заполняемый объект с информацией о пользователе, и я хочу, чтобы для страны было установлено значение null, когда была выбрана опция «-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
}
}
Когда я отправляю форму, она работает, потому что, когда у меня для страны установлено значение null, когда я выбрал опцию «-Select one-» или экземпляр выбранной страны. Проблема в том, что когда я загружаю форму, у меня есть метод, подобный следующему, для загрузки информации о пользователе.
@ModelAttribute("user")
public User getUser(){
//loads user from database
}
Объект, который я получаю от getUser(), имеет страну, установленную для определенной страны (не нулевое значение), но в поле со списком не выбран ни один параметр. Я отладил приложение, и CustomCountryEditor хорошо работает при настройке и получении текста, хотя метод getAsText вызывается для каждого элемента в списке «страны», а не только для поля «страна».
Есть идеи? Есть ли лучший способ установить нуль для объекта страны, когда я не выбираю опцию страны в поле со списком?
Спасибо