Spring MVC - Как мне вызвать один и тот же URL с разными аннотациями сопоставления - PullRequest
0 голосов
/ 02 февраля 2019

Я установил контроллер двумя способами.Сопоставления URL-адресов точно такие же, и единственное отличие заключается в методе аннотации сопоставления.Один из них - @PostMapping, а другой - @DeleteMapping, написанный в этом порядке.Однако, когда я пытаюсь вызвать метод @DeleteMapping, вызывается метод @PostMapping.

Обратите внимание, что, хотя переменные в двух формах URL разные, они имеют одинаковые значения.Они просто из разных HTML-страниц.

Вопрос в том, как каждый раз вызывать нужный метод.

@ Метод PostMapping

@Secured({"ROLE_ADMIN", "ROLE_STUDENT"})
@PostMapping("students/{username}/internships/{id}")
public String addInternship(Model model, @PathVariable("username") String username, @PathVariable("id") int id) {

    /* DOES SOME STUFF
    Student student = userService.getUser(username).getStudent();
    Internship internship = userService.getInternship(id);

    StudentInternship studentInternship = new StudentInternship(internship, student, "Sent");

    internship.setNumberOfPositions(internship.getNumberOfPositions() - 1);
    userService.updateInternship(internship);

    student.setApplicationNumber(student.getApplicationNumber() + 1);
    userService.updateStudent(student);

    userService.addStudentInternship(studentInternship);
    */

    return "redirect:/internships";
}

@ Метод DeleteMapping

@Secured({"ROLE_ADMIN", "ROLE_STUDENT"})
@DeleteMapping("students/{username}/internships/{id}")
public String removeInternship(Model model, @PathVariable("username") String username, @PathVariable("id") int id) {

    /* DOES SOME STUFF
    Student student = userService.getUser(username).getStudent();
    Internship internship = userService.getInternship(id);

    int studentInternshipID = userService.getStudentInternshipByParams(student, internship).getId();

    internship.setNumberOfPositions(internship.getNumberOfPositions() + 1);
    userService.updateInternship(internship);

    student.setApplicationNumber(student.getApplicationNumber() - 1);
    userService.updateStudent(student);

    userService.removeStudentInternship(studentInternshipID);
    */

    return "redirect:/students/" + username + "/internships";
}

HTML

<form:form action="${pageContext.request.contextPath}/students/${username}/internships/${tempInternship.id}" method="POST">
    <input type="submit" value="Request" ${disabled}/>
</form:form>

<form:form action="${pageContext.request.contextPath}/students/${tempStudentInternship.student.username}/internships/${tempStudentInternship.internship.id}" method="DELETE">
    <input type="submit" value="Dismiss" />
</form:form>

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Браузеры поддерживают только GET и POST как методы HTTP-запроса .Решение состоит в том, чтобы отправить форму с помощью метода POST и внедрить скрытое поле в ту же HTML-форму с именем _method, где в качестве значения будет выбран нужный метод, в данном случае это просто DELETE.Для случая POST просто напишите свою форму как обычно.

Пример:

<form:form action="${pageContext.request.contextPath}/students/${tempStudentInternship.student.username}/internships/${tempStudentInternship.internship.id}" method="POST">
    <input type="hidden" name="_method" value="DELETE"/>
    <input type="submit" value="Dismiss" />
</form:form>

Пожалуйста, посмотрите на этот ответ для создания пружинного компонента и последующего применения указанного атрибута формы внутри spring:form html форм.

0 голосов
/ 02 февраля 2019

Только GET и POST допускаются из формы.Вам необходимо использовать AJAX для указания дополнительных типов запроса.Привет вам нужно использовать javascript и XMLHttpRequest для того, чтобы указать тип запроса.

Вот один пример, который я случайно взял из интернета:

// Delete a user
var url = "http://localhost:8080/api/v1/users";
var xhr = new XMLHttpRequest();
xhr.open("DELETE", url+'/12', true);
xhr.onload = function () {
    var users = JSON.parse(xhr.responseText);
    if (xhr.readyState == 4 && xhr.status == "200") {
        console.table(users);
    } else {
        console.error(users);
    }
}
xhr.send(null);
...