POST上的Spring重定向

时间:2016-11-16 11:36:45

标签: spring spring-mvc spring-security spring-boot thymeleaf

这是我的更新用户方法:

@ResponseBody
@Transactional
@RequestMapping(value = "/profile/edit/{id}", method = RequestMethod.POST)
public String updateUser(@PathVariable("id") final Integer id, String firstname, String lastname, final RedirectAttributes redirectAttributes) {

    respository.updateFirstname(id,firstname);
    respository.updateLastname(id, lastname);

    redirectAttributes.addFlashAttribute("message", "Successfully changed..");
    return "redirect:/profile";
}

一切正常。也是数据库中的更新。但重定向只是一个字符串,不会更改路径。有人可以告诉我为什么吗?

3 个答案:

答案 0 :(得分:4)

问题出在@ResponseBody注释中。删除后,重定向应按预期工作。通过使用它,您可以覆盖Spring MVC的默认行为,并将返回值视为原始响应。

答案 1 :(得分:2)

@ResponseBody仍然可以进行重定向。

您可以通过以下方式执行此操作,这样您仍然可以在@ResponseBody(例如json)中传递预期数据,并且如果某些" usecase"强迫你重定向do重定向。同样如建议的那样,不要在控制器级别使用Transactional范围,而是在服务层上执行

@ResponseBody
@RequestMapping(value = "/profile/edit/{id}", method = RequestMethod.POST)
public String updateUser(@PathVariable("id") final Integer id, String firstname, String lastname, final RedirectAttributes redirectAttributes, HttpServletResponse response) {

    respository.updateFirstname(id,firstname);
    respository.updateLastname(id, lastname);

    if(someCondition == "redirectMe"){
       redirectAttributes.addFlashAttribute("message", "Successfully changed..");
       response.sendRedirect("/profile");
    }

 return "some_data_for_view";
}

答案 2 :(得分:0)

@GetMapping("/abc/def")
public void some_method(HttpServletResponse response){
//to do
response.sendRedirect("url");
}