Spring Boot - 重定向到不同的控制器方法

32

我正在使用SpringBoot和Thymeleaf创建一个非常基础的应用程序。在控制器中,我有以下两个方法:

Method1 - 此方法显示来自数据库的所有数据:

  @RequestMapping("/showData")
public String showData(Model model)
{
    model.addAttribute("Data", dataRepo.findAll());
    return "show_data";
}

方法2 - 此方法向数据库添加数据:

@RequestMapping(value = "/addData", method = RequestMethod.POST)
public String addData(@Valid Data data, BindingResult bindingResult, Model model) {
    if (bindingResult.hasErrors()) {
        return "add_data";
    }
    model.addAttribute("data", data);
    investmentTypeRepo.save(data);

    return "add_data.html";
}

这些方法对应的HTML文件分别为show_data.html和add_data.html。

一旦addData方法完成,我希望显示数据库中的所有数据。但是上面的代码会将页面重定向到静态的add_data.html页面,并且新添加的数据不会显示出来。我需要以某种方式调用控制器上的showData方法,所以我需要将用户重定向到/showData URL。这是可能的吗?如果可能,应该如何实现?

4个回答

50

试试这个:

@RequestMapping(value = "/addData", method = RequestMethod.POST)
public String addData(@Valid Data data, BindingResult bindingResult, Model model) {

    //your code

    return "redirect:/showData";
}

7
如果您正在尝试将请求从一个RestController重定向到另一个RestController,则无法起作用。 - Ramjan Ali
1
这对我来说毫无意义。 - Hola Soy Edu Feliz Navidad

18

sparrow的解决方案对我没有起作用。它只会渲染文本“redirect:/”。

通过在控制器方法头中添加HttpServletResponse httpResponse,我能够让它正常工作。

然后在代码中,在方法中添加httpResponse.sendRedirect("/");

示例:

@RequestMapping("/test")
public String test(@RequestParam("testValue") String testValue, HttpServletResponse httpResponse) throws Exception {
    if(testValue == null) {
        httpResponse.sendRedirect("/");
        return null;
    }
    return "<h1>success: " + testValue + "</h1>";
}

1
如果它只呈现了文本"redirect:/",那么你可能在控制器上使用了@RestController的注解,但是你只需要@Controller的注解才能使其正常工作。 - Eimantas G

1
以下解决方案对我有用。 getAllCategory() 方法显示数据并 createCategory() 方法将数据添加到数据库。使用 return "redirect:categories";,将重定向到 getAllCategory() 方法。
@GetMapping("/categories")
public String getAllCategory(Model model) {
    model.addAttribute("categories",categoryRepo.findAll());
    return "index";
}

@PostMapping("/categories")
public String createCategory(@Valid Category category) {

    categoryRepo.save(category);
    return "redirect:categories";
}

或者使用ajax jQuery,这也是可能的。


0
你应该在addData请求中返回一个3xx的HTTP状态码,并将重定向URL放在响应中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接