Spring Boot, delete/patch запрос
Пытаюсь реализовать проект на Spring Boot + Spring Security + Spring Data JPA. Возникла проблема с DELETE запросом. Помогите пожалуйста решить проблему или направьте где почитать.
Класс контроллера:
@Controller
public class ProjectController {
private final ProjectRepository projectRepository;
@Autowired
public ProjectController(ProjectRepository projectRepository) {
this.projectRepository = projectRepository;
}
@DeleteMapping("/feed/{project_id}")
public String deleteProject(@PathVariable("project_id") long id) {
projectRepository.deleteById(id);
return "redirect:/feed";
}
}
Форма запроса:
<form th:method="delete" th:action="@{/feed/{project_id}(project_id = ${project.id})}">
<strong th:text="${project.name}">1</strong>
<input type="submit" value="Delete" />
</form>
в итоге из бд ничего не удаляется
Изменил код для более глубокого понимания:
Класс контроллера:
@RestController
@RequestMapping("/feed")
public class ProjectController {
@GetMapping
public ModelAndView getAll() {
ModelAndView view = new ModelAndView();
view.setViewName("/feed");
return view;
}
@PostMapping
public String create() {
return "Create new project";
}
@GetMapping("/{id}")
public String getOne() {
return "Get one project";
}
@PatchMapping("/{id}")
public String update() {
System.out.println("Project is deleted");
return "Project is updated";
}
}
Формы запроса:
<form method="post" th:action="@{/feed}">
<div>
<input type="submit" value="Add" />
</div>
</form>
<form th:method="patch" th:action="@{/feed/1}">
<input name="_method" type="hidden" value="patch" />
<div>
<input type="submit" value="Patch" />
</div>
</form>
<form th:method="delete" th:action="@{/feed/1}">
<div>
<input type="submit" value="Delete" />
</div>
</form>
В итоге запросы GET, POST отрабатывают отлично, а DELETE и PATCH - никак, в чем может быть проблема?
Ответы (1 шт):
Вопрос снят!
Если в проекте используется Spring Security то в каждом запросе автоматически передаются csrf токены запросы PUT, PATCH, DELETE необходимо передавать через thymeleaf:
<form th:method="delete" th:action="@{/feed/1}">
<input type="submit" value="Delete" />
</form>
Таким образом после генерации тело запроса выглядит так:
<form method="post" action="/feed/1">
<input type="hidden" name="_csrf" value="беспорядочный набор символов">
<input type="hidden" name="_method" value="delete" wfd_invisible="true">
<input type="submit" value="Delete" />
</form>
Thymeleaf генерирует скрытые методы, а их необходимо разрешить. Я знаю только о двух способах их разрешения:
в файле помеченном аннотацией @Configuration или @SpringBootApplication необходимо создать следующий бин:
@Bean public FilterRegistrationBean hiddenHttpMethodFilter() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new HiddenHttpMethodFilter()); filterRegistrationBean.setUrlPatterns(Arrays.asList("/*")); return filterRegistrationBean; }В файле application.properties добавить:
spring.mvc.hiddenmethod.filter.enabled=true
Выберите один из способов и переходите к последующим проблемам)