转发到另一个从POST操作接收参数的弹簧控制器

时间:2017-04-15 17:16:04

标签: java spring spring-mvc

我有一个控制器的请求映射让我们说它是A,它接收post动作并使用它的post值作为参数,有时参数会很长,所以这就是为什么它的POST不是GET的最佳实践和安全性;

set

然后事实证明,在另一个弹簧控制器中,我需要将请求转发给第一个。

问题是我如何在将请求转发到第一个请求映射之前将其添加到请求中?举个例子来说是健康的吗?

unset

鉴于:

  • 我不希望第一个请求映射使用get而不是上述原因的帖子。
  • 我不想通过创建另一个从模型映射中提取参数作为属性的方法来编写冗余代码。

1 个答案:

答案 0 :(得分:2)

您不应该手动调用其他控制器!你可以做的是使用RedirectAttributes重定向到它们,如:

@RequestMapping(value = "/doctor/doEditPatientDetails", method = RequestMethod.POST)
public String editPatientDetails(Model model, @ModelAttribute(value = "user") @Valid User user,
        BindingResult result, RedirectAttributes attr, Principal principal) {
    if (null != principal) {
        if (result.hasErrors()) {
            attr.addFlashAttribute("org.springframework.validation.BindingResult.user", result);
            attr.addFlashAttribute("user", user);
            attr.addAttribute("id", user.getId());
            return "redirect:/doctor/editPatient/{id}";
        }
    }
    ....
    return "redirect:/doctor/patients";
}

@RequestMapping(value = "/doctor/editPatient/{id}", method = RequestMethod.GET)
public String showEditPatient(Model model, @ModelAttribute("id") String id, Principal principal) {
    if (null != principal) {
        //here you can access the model and do what everything you want with the params.
        if (!model.containsAttribute("user")) {
            model.addAttribute("user", user);
        }
    ....
    }

    return "/doctor/editPatient";
}

请注意,要重定向到类似"重定向的链接:/ doctor / editPatient / {id}"你必须在RedirectAttributes中添加id。也不是说有很多方法可以实现像HttpServletRequest

这样的相同功能