Установка для вложенного объекта значения null, когда выбранный параметр имеет пустое значение

У меня есть класс, который моделирует пользователя, и другой, который моделирует его страну. Что-то вроде этого:

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 вызывается для каждого элемента в списке «страны», а не только для поля «страна».

Есть идеи? Есть ли лучший способ установить нуль для объекта страны, когда я не выбираю опцию страны в поле со списком?

Спасибо


person Javi    schedule 15.04.2010    source источник


Ответы (2)


Проблема заключалась в том, что я извлекал объект User из основного объекта Spring Security. Я изменил свой метод getUser, поэтому я получаю идентификатор из Spring Security и выполняю поиск в базе данных, и теперь все работает, хотя я не понимаю, почему это произошло, потому что я вижу в отладке, что страна была загружена пользователем Spring Безопасность.

person Javi    schedule 19.04.2010

Вы проверяли таблицу базы данных для пользователя, какое значение для страны устанавливается при сохранении пользователя ... это значение null или есть какое-то значение?

person Hussain Fakhruddin    schedule 16.04.2010
comment
У меня есть номер, он не нулевой в базе данных. Я проверил, что этот идентификатор совпадает с номером, возвращаемым в методе getAsText() моего редактора. - person Javi; 16.04.2010
comment
можете ли вы опубликовать свою страницу jsp и код контроллера для редактирования пользователя. - person Hussain Fakhruddin; 18.04.2010