Обновите @ModelAttribute существующими значениями


Я хочу знать, есть ли способ обновить существующий атрибут @ModelAttribute. Если возможно, без сохранения значений в сеансе
Допустим, у меня есть компонент:

class TravelDetails{
    private String origin;
    private String destination;
    private String travelerName;
    private String travelerAge;
        // Getters & Seters
}

Вот мой контроллер:

@Controller
class TravelerController{

@RequestMapping(value="/searchDetails", method=RequestMethod.GET)
public ModelAndView getSearchDetails(@RequestParam("origin") String origin,
        @RequestParam("destination") String destination,ModelMap modelMap){
    TravelDetails travelDetails = new TravelDetails();
    travelDetails.setOrigin(origin);
    travelDetails.setDestination(destination);
    modelMap.addAttribute("travelDetails",travelDetails);
    return new ModelAndView("get_traveler_details");
    }

@RequestMapping(value="/addTravelerDetails", method=RequestMethod.POST)
public ModelAndView addTravelerDetails(
    @ModelAttribute("travelDetails") TravelDetails travelDetails,
           ModelMap modelMap){
    System.out.println(travelDetails.getOrigin);
    System.out.println(travelDetails.getDestination);
    System.out.println(travelDetails.getTravelerName);
    System.out.println(travelDetails.getTravelerAge);
    return new ModelAndView("get_traveler_details");
    }
   }

Форма сообщения, полученная во втором методе контроллера, содержит только имя и возраст путешественника, в то время как происхождение и пункт назначения должны быть получены из атрибута модели, установленного в первом контроллере.
Я не хочу явно устанавливать заданные скрытые поля в форме Post.
Предположим, мой HTML-код будет таким:

<form:form modelAttribute="travelDetails" action="/addTravelerDetails" method="POST">
    <form:input type="text" path="travelerName"/>
    <form:input type="text" path="travelerAge"/>
</form:form>

Примечание. Я пишу код в текстовой области StackOverflow, а не в какой-либо среде IDE, поэтому, если в коде есть некорректная орфографическая или синтаксическая ошибка, не обращайте внимания.


person Yadvendra    schedule 20.05.2016    source источник
comment
вы можете захотеть сохранить информацию в сеансе   -  person sidgate    schedule 20.05.2016
comment
Нет, не хочу. Предпочел бы другой способ, если он существует.   -  person Yadvendra    schedule 20.05.2016
comment
почему вы не хотите отправить обратно пункт назначения? причины безопасности?   -  person sidgate    schedule 20.05.2016
comment
@sidgate На самом деле это был всего лишь пример. У моего фактического bean-компонента более 50 атрибутов. Я не предпочитаю снова отправлять одни и те же значения по сети + это увеличило бы JSP.   -  person Yadvendra    schedule 20.05.2016
comment
@sidgate Любое решение? Отметьте того, кого вы знаете, кто может ответить. Спасибо   -  person Yadvendra    schedule 20.05.2016
comment
вы можете получить необходимые данные из запроса, из сеанса или из постоянного источника. нет другого пути.   -  person sidgate    schedule 20.05.2016
comment
Либо оставьте его в сеансе, либо отправьте всю информацию, либо используйте метод с аннотациями @ModelAttribute и всегда отправляйте идентификатор и извлекайте его из базы данных. Что касается производительности, я предлагаю сохранить его в сеансе с использованием @SessionAttributes (хотя на самом деле он не предназначен для передачи атрибутов между контроллерами, но может работать). Попадание в базу данных для каждого запроса на самом деле не масштабируется.   -  person M. Deinum    schedule 20.05.2016


Ответы (1)


Вы можете использовать аннотацию @SessionAttributes на уровне класса

@Controller
@SessionAttributes("travelDetailsPersist")
class TravelerController{

    @RequestMapping(value="/searchDetails", method=RequestMethod.GET)
    public ModelAndView getSearchDetails(@RequestParam("origin") String origin, @RequestParam("destination") String destination,ModelMap modelMap){
        TravelDetails travelDetails = new TravelDetails();
        travelDetails.setOrigin(origin);
        travelDetails.setDestination(destination);
        modelMap.addAttribute("travelDetails",travelDetails);
        modelMap.addAttribute("travelDetailsPersist",travelDetails);
        return new ModelAndView("get_traveler_details");
    }

    @RequestMapping(value="/addTravelerDetails", method=RequestMethod.POST)
    public ModelAndView addTravelerDetails(@ModelAttribute("travelDetailsPersist") TravelDetails travelDetailsPersist, @ModelAttribute("travelDetails") TravelDetails travelDetails, ModelMap modelMap){
        System.out.println(travelDetailsPersist.getOrigin);
        System.out.println(travelDetailsPersist.getDestination);
        System.out.println(travelDetails.getTravelerName);
        System.out.println(travelDetails.getTravelerAge);
        return new ModelAndView("get_traveler_details");
    }  
}
person Prakash Hari Sharma    schedule 20.05.2016
comment
Спасибо за решение, но, как я уже упоминал в вопросе, я не предпочитаю сохранять значения в сеансе. - person Yadvendra; 20.05.2016
comment
Также, когда вы отправляете атрибут модели travelDetailsPersist на html-страницу первым контроллером, ваш travelDetailsPersist будет действовать как атрибут модели для формы, и при отправке формы тот же атрибут travelDetailsPersist будет обновлен, а атрибут travelDetails будет иметь значение null. Поправьте меня если я ошибаюсь. - person Yadvendra; 20.05.2016
comment
и если вы не хотите, чтобы он оставался сеансом, вы можете использовать свою собственную логику устойчивости для хранения и извлечения - person Prakash Hari Sharma; 20.05.2016
comment
Любой намек на то, как это сделать? - person Yadvendra; 20.05.2016
comment
одним из возможных решений может быть передача исходной и конечной точек из формы в виде скрытого поля, а затем в методе addTravelerDetails вы можете получить остальные атрибуты (вы упомянули более 50) на основе происхождения и назначения. - person Prakash Hari Sharma; 20.05.2016
comment
Или, если вы выполнили поиск IF, вы можете просто передать его, чтобы добавить информацию о поездке. - person Prakash Hari Sharma; 20.05.2016