Spring Boot Controller

时间:2017-10-20 17:22:21

标签: java spring spring-boot

我有以下代码

@Controller
@RequestMapping("/recipe")
public class RecipeController {
private IRecipeService recipeService;

@Autowired
public RecipeController(IRecipeService recipeService) {
    this.recipeService = recipeService;
}

@GetMapping("/{id}/show")
public String showById(@PathVariable String id, Model model) {

    model.addAttribute("recipe", recipeService.findById(Long.valueOf(id)));

    return "recipe/show";
}
@GetMapping("/{id}/update")
    public String updateRecipe(@PathVariable String id, Model model) {
        model.addAttribute("recipe", recipeService.findCommandById(Long.valueOf(id)));

    return "recipe/recipeform";
}

@PostMapping("/")
public String saveOrUpdate(@ModelAttribute RecipeCommand command) {
    RecipeCommand savedCommand = recipeService.saveRecipeCommand(command);

    return "redirect:/recipe/" + savedCommand.getId() + "/show";
}}

现在,当我转到http://localhost:8080/recipe/2/update并点击提交时,我会调用 @PostMapping 方法,在更新时将我重定向到 return "redirect:/recipe/" + savedCommand.getId() + "/show";

但是我在控制台上出现了这个错误

Resolved exception caused by Handler execution: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported

并在网上

There was an unexpected error (type=Method Not Allowed, status=405). Request method 'GET' not supported

当我将@PostMapping更改为@RequestMapping或添加其他@GetMaapping时,一切正常

任何人都可以解释这个或我能做些什么,以便@PostMapping按预期工作。

可能的原因 sample

更新:如下面的评论中所述 - 我们可以在SpringData中直接使用@PathVariable https://stackoverflow.com/a/39871080/4853910

1 个答案:

答案 0 :(得分:1)

我猜你必须更改HTML中的FORM,以便在提交时使用POST,而不是GET:这样做

<form method="post" ...>

至少截图似乎在提交HTML FORM后显示来自浏览器的提交请求, 它显示它是一个GET请求(所有表单字段都作为请求参数)。

所以spring是正确的:URL(“/ recipe /?id = 2&amp; description = Spicy ...”)只匹配saveAndUpdate()的Mapping,对于这个方法,你只注释了“POST”,因此:控制器中的“/ recipe /?id = 2&amp; description = Spicy ...”上的GET没有匹配。

你能在这里发布带有HTML的HTML片段吗?     <FORM>...</FORM> 一部分?