Spring: передача измененного объекта команды на страницу ответа - PullRequest
0 голосов
/ 18 сентября 2011

У меня есть простая форма JSP Spring 2.5, где я принимаю знак зодиака пользователя из выпадающего списка, проверяю, что он выбрал параметр, и при отправке формы я вызываю служебный метод, чтобы получить прогноз для знака ( фактически случайные строки для этого тестового приложения).

Но когда я установил его в ModelAttrribute, он не будет передан на страницу ответа. Как я могу передать дополнительный атрибут на страницу ответа?

Объект моей модели - Forecast, с двумя атрибутами ZodiacSign и Forecast. Следующий код в контроллере, который вызывается при отправке формы:

@RequestMapping(method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("forecast") Forecast forecast, BindingResult result, SessionStatus status, ModelMap model) { 
    forecastFormValidator.validate(forecast, result); 
    if (result.hasErrors()) {
        //if validator fails
        return "forecastForm";
    } 
    else {
        //the utility class, will set a random string as forecast
        //in the forecast attribute of forecast object and return the
        //modified object
        forecast = myUtil.returnForecastForZodiac(forecast);

        //Following prints the forecast string correctly
        System.out.println(forecast.getForecast());
    }                       

    status.setComplete();
    //form success
    return "forecastSuccess";
}

JSP forecastSuccess просто отображает атрибуты модели «прогноз» (пример: $ {forecast.zodiacSign}), но не отображает значение атрибута прогноза, которое я установил в методе выше ( в Факт я изменил сам объект ).

Кажется, что форма ответа передана старому объекту, который forecastForm предоставил его (только со знаком зодиака), и манипуляции, которые я делал в моем методе, не повлияли на него.

1 Ответ

0 голосов
/ 19 сентября 2011

Это не имеет никакого отношения к весне. Вы неправильно использовали ссылку forecast.

Это ошибочный код:

forecast = myUtil.returnForecastForZodiac(forecast);

Ссылка forecast теперь указывает на локальный объект в вашем методе, созданный вашим вызовом утилиты.Но ссылка является копией и, следовательно, исходный объект остается неизменным.

После выхода из метода вы возвращаетесь к старому значению.

Вы должны сделать forecast.setStuff(...), а не forecast = someStuff.Первый изменяет объект, второй переназначает ссылку, оставляя исходную нетронутой.

Помните, что Java всегда передается по значению (даже ссылка передается по значению). Дополнительное прочтение приведено здесь для объяснения того, почему назначение параметров объекта не всегда дает ожидаемый результат .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...