2

Ich habe ein Problem mit der Web-Anwendung. Ich bin ein Student und lerne immer noch. Dies ist ein einfaches Forum mit Login, Registrierung, Hinzufügen neuer Themen und Posts. Es ist auch möglich, das Thema GetMapping-Methode zu entfernen, das ohne Probleme funktioniert. Leider habe ich einen Befehl bekommen, um das GetMapping zu löschen und nach der Änderung einen Fehler in der Anwendung des Inhalts zu bekommen: "Es gab einen unerwarteten Fehler (type = Method Not Allowed, status = 405). Anfrage Methode 'GET' nicht unterstützt ' Ich habe im Internet gesucht, um dieses Problem zu lösen, aber nach dem Überprüfen der verschiedenen Optionen, ist es immer noch der gleiche Fehler.Am nicht genug Erfahrung in diesem Thema, daher war eine Menge der Anweisungen für mich unklar bitte helfenRequest-Methode 'GET' nicht unterstützt Fehler nach Änderung @ GetMapping Delete-Methode

So wird diese topic.html Ansicht vor Änderungen löschen.

<!DOCTYPE HTML> 
 
<html xmlns:th="http://www.thymeleaf.org"> 
 
<head> 
 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
 
<title>Forum - Topic</title> 
 
</head> 
 
<body background="http://2.bp.blogspot.com/-BsL9gRE80Ug/U0OgeWbbxtI/AAAAAAAAF-w/teXrzw-TBcU/s1600/nacre-background-tile.jpg"> 
 
<table class="table table-striped"> 
 
<a href="http://localhost:8080/forum">Powrot</a> 
 
    <tr> 
 
    <th>Title: </th> 
 
\t <th><p th:text="${topicName}" /></th> 
 
    </tr> 
 
    <tr> 
 
\t <td th:text="${topicAuthor}" ></td> 
 
\t <td th:text="${topicDate}" ></td> 
 
\t <table border="1"> 
 
\t <td th:text="${topicContent}"></td> 
 
\t </table> 
 
    </tr> 
 
    <table> 
 
\t \t <br><b>-------------------------------------------------------</b></br> 
 
\t \t <a th:href="@{/new_message(id=${topicId})}">Add new post</a> 
 
\t \t <br><a th:href="@{/delete(id=${topicId})}">Delete this topic</a></br> 
 
\t \t <br><b>-------------------------------------------------------</b></br> 
 
    </table> 
 
</table> 
 
<table class="table table-striped"> 
 
    <tr th:each="message,iterStat : ${list}"> 
 
    <td th:text="${message.author}"></td> 
 
    <td th:text="${message.date}"></td> 
 
    <table border="1"> 
 
    \t <td th:text="${message.content}"></td> 
 
    </table> 
 
    <table> 
 
    \t <p> - - - - - - - - </p> 
 
    </table> 
 
    </tr> 
 
</table> 
 
</body> 
 
</html>

und nach Änderungen:

... 
 
    <table> 
 
     <br><b>-------------------------------------------------------</b></br> 
 
     <a th:href="@{/new_message(id=${topicId})}">Add new post</a> 
 
     <form action="#" th:action="@{/delete(id=${topicId})}" method="delete"> 
 
     <br><a th:href="@{/delete(id=${topicId})}">Delete this topic</a></br> 
 
    </form> 
 
     <br><b>-------------------------------------------------------</b></br> 
 
    </table> 
 
...

auch bearbeitet ich den Controller. Dies ist eine vorherige, Arbeitsversion mit Getmapping:

@Controller public class TopicController 
{ 
@Autowired 
private TopicRepository topicRepository; 

@Autowired 
private MessageRepository messageRepository; 

@Autowired 
private UserRepository userRepository; 

@GetMapping("/delete") 
public String deleteTopic(@CookieValue(value = "userId", defaultValue = "-1") String userId, 
     @RequestParam("id") String topicId, Model model) 
{ 
    if(userId.equals("-1")) 
    { 
     model.addAttribute("user", new User()); 
     return "login";   
    } 
    else 
    { 
     Topic topic = topicRepository.findByIdIn(Integer.parseInt(topicId)); 
     if(topic.getUserId() == Integer.parseInt(userId)) 
     { 
      topicRepository.delete(topic); 
     } 
     return "redirect:/forum"; 
    } 

} 

}

Und die neue Version, die nicht funktioniert:

@RequestMapping(value = "/{delete}", method = RequestMethod.DELETE) 
public @ResponseBody String deleteTopic(@CookieValue(value = "userId", defaultValue = "-1") String userId, 
     @RequestParam("id") String topicId, @ModelAttribute Topic topic, Model model) 
{ 
    if(userId.equals("-1")) 
    { 
     model.addAttribute("user", new User()); 
     return "login";   
    } 
    else 
    { 
     Topic topicDB = topicRepository.findByIdIn(Integer.parseInt(topicId)); 
     if(topicDB.getUserId() == Integer.parseInt(userId)) 
     { 
      topicRepository.delete(topicDB); 
     } 
     return "redirect:/forum"; 
    } 
} 

Antwort

0

Die DELETE Methode in HTML-Formularen wird nicht unterstützt. Also, wenn Sie das Folgende schreiben, verwendet Ihr Browser nur eine normale GET.

<form action="#" th:action="@{/delete(id=${topicId})}" method="delete"> 

Verwenden Sie die POST Methode, weil Sie Daten auf dem Server zu ändern. Wenn Sie die Anwendung denken, ein DELETE Methode machen wollen verwendet wurde, verwenden Sie die HiddenHttpMethodFilter mit einem versteckten Feld wie folgt aus:

<form action="#" th:action="@{/delete(id=${topicId})}" method="post"> 
    <input type="hidden" name="_method" value="delete"> 
    <br><a th:href="@{/delete(id=${topicId})}">Delete this topic</a></br> 
</form> 

Wenn Sie thymeleaf-spring> = 2.0.3 Sie das th:method Attribut verwenden können und thymeleaf schaffen wird das versteckte Feld automatisch, falls erforderlich. vielleicht

<form action="#" th:action="@{/delete(id=${topicId})}" th:method="delete"> 
    <br><a th:href="@{/delete(id=${topicId})}">Delete this topic</a></br> 
</form> 
+0

hmm ich tue etwas falsch, aber keine dieser Methoden nicht helfen :( – Mastrin1994

+0

Haben Sie den HiddenHttpMethodFilter korrekt registrieren? Schauen Sie in der Dokumentation (http://docs.spring.io/spring -boot/docs/current/Referenz/html/howto-eingebettete-servlet-containers.html # howto-hinzufügen-ein-Servlet-Filter-oder-Listener) für Details.Diese Antwort (http://StackOverflow.com/a/26157610/2847174) enthält ein Beispiel für einen anderen Filter –

+0

So, ich sprach mit meinem Lehrer und er sagte mir, dass ich zwei Optionen habe: 1. Machen Sie Javascript und dann löschen, oder 2. Machen Sie neue Controller, nur Löschen Sie und verwenden Sie dann nur Postman, um zu überprüfen, ob der Controller korrekt funktioniert Ich wählte die zweite Option und war in der Lage, die Arbeit zu erledigen. Ich habe eine positive Bewertung des Themas erhalten, so dass Sie dies als Teil der Lösung betrachten können. – Mastrin1994

Verwandte Themen