DeleteMapping Spring Boot Freemarker, не получается удалить

206
07 сентября 2021, 23:50

Есть на странице лист объектов, хочу добавить кнопку удалить. Нахожу объект по айди(хотя вопрос зачем, я же кнопку жму по тому объекту, который имеет уже айдишник).

@DeleteMapping("/notes/{id}")
    public String deleteNote(@PathVariable Long id, Model model
    ) {
        Note note = noteRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("Invalid note Id" + id));
        noteRepository.delete(note);
        model.addAttribute("noteDelete", note);
        return "notes";
    }

notes.ftl:

<#list notes as note>
    <p>${note.id}. Title:${note.title} Read<a href="/notes/${note.id}">more</a></p>
    <form action="/notes/${noteDelete.id}">
        <input type="submit" value="Delete">
    </form>
<#else>
    <p>Notes not found</p>
</#list>

Как правильно тут удалить? В чем ошибка

Answer 1

@DeleteMapping принимает запросы с методом DELETE. Не указывая атрибута method в теге form, по умолчанию методом запроса будет GET. НО, в атрибуте method можно указать только GET и POST. Это означает, что данный запрос нужно отправлять с помощью JavaScript (XMLHttpRequest или Fetch API).

Answer 2
@PostMapping("/notes/{id}")
    public String deleteNote(@PathVariable("id") Long id, Model model
    ) {
        Note note = noteRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("Invalid note Id" + id));
        noteRepository.delete(note);
        model.addAttribute("noteDelete", note);
        return "redirect:/notes";
    }

notes.ftl:
<#list notes as note>
    <p>${note.id}. Title:${note.title} Read<a href="/notes/${note.id}">more</a></p>
    <form action="/notes/${noteDelete.id}" method="post"> 
        <input type="submit" value="Delete">
        <input type="hidden" name="_csrf" value="${_csrf.token}"/>
    </form>
<#else>
    <p>Notes not found</p>
</#list>