如何在重定向后保留模型属性?

时间:2015-11-20 10:28:29

标签: java spring-mvc

我有一个对象,我在视图中填写表单"提交"。

之后,它会发布对象" WelcomeMessageFinder"在视图中"返回"。

我使用此对象调用服务。如果服务失败,我想重定向到视图"提交"并保持表格填充以前的值。

我的问题是我找不到如何保留" WelcomeMessageFinder"重定向后的对象。它总是会创建一个新的空对象。

这是我的代码:

@Controller
@SessionAttributes("welcomeMessageFinder")
public class SandBoxController extends PortalWebuiController {
    @ModelAttribute("welcomeMessageFinder")
    public WelcomeMessageFinder welcomeMessageFinder() {
        return new WelcomeMessageFinder();
    }

    @RequestMapping(value = "/submit", method = RequestMethod.GET)
    public String submit(WelcomeMessageFinder welcomeMessageFinder, Model model, SessionStatus sessionStatus, HttpSession httpSession) {
        // On Init : a new WelcomeMessageFinder is created
        // After redirect : I want to keep the filled WelcomeMessageFinder but a new one is created ...
        model.addAttribute("zenithUserSession", zenithUserSession);
        return "submitwelcomemessage";
    }

    @RequestMapping(value = "/return", method = RequestMethod.POST)
    public String retun(
            WelcomeMessageFinder welcomeMessageFinder,
            Model model,
            RedirectAttributes redirectAttributes,
            SessionStatus sessionStatus, HttpSession httpSession) {
        // welcomeMessageFinder contains the parameters I enter in the form.
        redirectAttributes.addFlashAttribute("welcomeMessageFinder", welcomeMessageFinder);
        return "redirect:/submit";
    }
}

如何在重定向之前和之后保留相同的WelcomeMessageFinder对象?

我发现这个question表示我不能将SessionAttributes与重定向一起使用,因为它不会保留会话。它说使用RedirectAttributes,但属性似乎重新初始化。

编辑:

我终于找到了我的错误。这段代码有效,问题出在我的类WelcomeMessageFinder上。要在Flash会话中添加对象,此对象必须是Serializable。我忘了在班上实现Serializable。

添加后,它可以正常工作。

2 个答案:

答案 0 :(得分:1)

我终于找到了我的错误。这段代码有效,问题出在我的类WelcomeMessageFinder上。要在Flash会话中添加对象,此对象必须是Serializable。我忘了在班上实现Serializable。

添加后,它可以正常工作。

答案 1 :(得分:0)

这是因为这段代码

 "@ModelAttribute("welcomeMessageFinder")
    public WelcomeMessageFinder welcomeMessageFinder() {
        return new WelcomeMessageFinder();
    }"

。它总是在调用任何请求映射方法之前执行