Установка вложенного объекта в ноль, когда выбранная опция имеет пустое значение - PullRequest
4 голосов
/ 15 апреля 2010

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

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

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

Спасибо

Ответы [ 2 ]

1 голос
/ 19 апреля 2010

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

0 голосов
/ 16 апреля 2010

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

...