post 补丁方法不支持该方法
post method not supported in patch method
我想通过hibernate-validator 验证编辑实体,但是在调用patch 方法时抛出错误:post method not supported
。如何让@PatchMapping
正常工作?我是初学者开发者,请帮助我。
控制器:
@GetMapping("/edit/{id}") //for admin & developer
public String edit(@PathVariable("id") Long id, Model model, @AuthenticationPrincipal UserDetails user){
final ProjectDTO project = this.projectService.getDTOById(id);
model.addAttribute("project",project);
model.addAttribute("currentUser", this.userService.findUserByNickname(user.getUsername()));
return "project/edit";
}
@PatchMapping("/update")
public String update(@RequestParam("project") @Valid Project project, BindingResult bindingResult,
Model model, @AuthenticationPrincipal UserDetails user,
@RequestParam("files") MultipartFile[] files) throws IOException{
final User author = userService.findUserByNickname(user.getUsername());
model.addAttribute("currentUser", author);
model.addAttribute("files", files);
if(bindingResult.hasErrors()){
return "project/edit";
}
List<FileInfo> infoList = this.projectService.upload(Arrays.asList(files));
project.setFileList(infoList);
project.setPreviewId(infoList.get(0).getId());
this.projectService.update(project);
return "redirect:/portfolio";
}
服务:
@Transactional
public void update(Project project){
this.projectRepository.update(project.getId(),
project.getTitle(),
project.getDescription());
}
存储库:
@Transactional
@Modifying
@Query(value = "UPDATE Project p SET p.title = :title, p.description = :description WHERE p.id = :id")
void update(@Param("id") Long id,
@Param("title") String title,
@Param("description") String description);
html形式:
<form th:action="@{/portfolio/update}" th:method="patch" th:object="${project}" enctype="multipart/form-data">
<div class="card-subtitle my-3">
<input class="form-control form-control-lg" type="text" th:field="*{title}" id="title" th:value="${project.getTitle()}">
<div style="color:red" th:if="${#fields.hasErrors('title')}" th:errors="*{title}" class="validation-message">TITLE_ERROR</div>
</div>
<div class="card-text my-2">
<textarea placeholder="Описание проекта" class="form-control form-control-lg" type="text" th:field="*{description}" rows="7" cols="65" id="description" th:inline="text">
[[${project.getDescription}]]
</textarea>
<div style="color:red" th:if="${#fields.hasErrors('description')}" th:errors="*{description}" class="validation-message">DESCRIPTION_ERROR</div>
</div>
<input class="my-3 form-control " type="file" name="files" multiple>
<div th:text="${error}">FILE_ERR</div>
<div class="card-footer d-flex justify-content-end">
<button type="submit" class="btn btn-success p-1 bd-highlight">Обновить проект</button>
</div>
</form>
您不能将 'PATCH' 用于表单方法属性。只允许 'GET' 和 'POST' 方法(source).
我想通过hibernate-validator 验证编辑实体,但是在调用patch 方法时抛出错误:post method not supported
。如何让@PatchMapping
正常工作?我是初学者开发者,请帮助我。
控制器:
@GetMapping("/edit/{id}") //for admin & developer
public String edit(@PathVariable("id") Long id, Model model, @AuthenticationPrincipal UserDetails user){
final ProjectDTO project = this.projectService.getDTOById(id);
model.addAttribute("project",project);
model.addAttribute("currentUser", this.userService.findUserByNickname(user.getUsername()));
return "project/edit";
}
@PatchMapping("/update")
public String update(@RequestParam("project") @Valid Project project, BindingResult bindingResult,
Model model, @AuthenticationPrincipal UserDetails user,
@RequestParam("files") MultipartFile[] files) throws IOException{
final User author = userService.findUserByNickname(user.getUsername());
model.addAttribute("currentUser", author);
model.addAttribute("files", files);
if(bindingResult.hasErrors()){
return "project/edit";
}
List<FileInfo> infoList = this.projectService.upload(Arrays.asList(files));
project.setFileList(infoList);
project.setPreviewId(infoList.get(0).getId());
this.projectService.update(project);
return "redirect:/portfolio";
}
服务:
@Transactional
public void update(Project project){
this.projectRepository.update(project.getId(),
project.getTitle(),
project.getDescription());
}
存储库:
@Transactional
@Modifying
@Query(value = "UPDATE Project p SET p.title = :title, p.description = :description WHERE p.id = :id")
void update(@Param("id") Long id,
@Param("title") String title,
@Param("description") String description);
html形式:
<form th:action="@{/portfolio/update}" th:method="patch" th:object="${project}" enctype="multipart/form-data">
<div class="card-subtitle my-3">
<input class="form-control form-control-lg" type="text" th:field="*{title}" id="title" th:value="${project.getTitle()}">
<div style="color:red" th:if="${#fields.hasErrors('title')}" th:errors="*{title}" class="validation-message">TITLE_ERROR</div>
</div>
<div class="card-text my-2">
<textarea placeholder="Описание проекта" class="form-control form-control-lg" type="text" th:field="*{description}" rows="7" cols="65" id="description" th:inline="text">
[[${project.getDescription}]]
</textarea>
<div style="color:red" th:if="${#fields.hasErrors('description')}" th:errors="*{description}" class="validation-message">DESCRIPTION_ERROR</div>
</div>
<input class="my-3 form-control " type="file" name="files" multiple>
<div th:text="${error}">FILE_ERR</div>
<div class="card-footer d-flex justify-content-end">
<button type="submit" class="btn btn-success p-1 bd-highlight">Обновить проект</button>
</div>
</form>
您不能将 'PATCH' 用于表单方法属性。只允许 'GET' 和 'POST' 方法(source).