Error: Request method 'GET' not supported

Error: Request method 'GET' not supported

我正在尝试通过 ID 删除用户。我已经能够通过 ID 搜索用户并通过 ID 更新(编辑)用户。但是,我在删除时遇到了问题。

这是我遇到的错误(Whitelabel 页面错误):

There was an unexpected error (type=Method Not Allowed, status=405).
Request method 'GET' not supported
org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported
    at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:250)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:417)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:364)
    at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:123)
    at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:66)
    at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:491)
    at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1255)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1037)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:832)

User.java

package com.springbootbasics;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name= "user")
public class User {
    
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id;
    private String name;
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + "]";
    }
    public User(long id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    public User() {
        super();
        // TODO Auto-generated constructor stub
    }
    
    
}
    

UserController.java

package com.springbootbasics;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;

@RestController
public class UserController {

    @Autowired
    private UserRepository userData;

        @GetMapping("/results")
        public ModelAndView getPage() {
            User usr = new User();
            return new ModelAndView("searchUsers", "fn", usr);       
        }

        @PostMapping("/results")
        public ModelAndView find(@RequestParam long id) {
            User usr = userData.findById(id).get();
            return new ModelAndView("results", "hello", usr);       
        }
        
        @GetMapping("/editemp")
        public ModelAndView getupdate(@RequestParam long id) {
            User usr = userData.findById(id).get();
            return new ModelAndView("update", "edit", usr);
        }
        @PostMapping("/editemp")
        public RedirectView updateEmp(User usr) {
            userData.save(usr);
            return new RedirectView("listemp");
        }
        
        //
        
        
        @DeleteMapping("/deletetemp")
        public RedirectView deleteUser(@PathVariable("id") long id)  
        {  
            userData.deleteById(id);
            return new RedirectView("listemp");
        } 
        
        //
    
        @GetMapping("/listemp")
        public ModelAndView listEmp() {
            List<User> allUsers = (List<User>) userData.findAll();
            return new ModelAndView("allUsers","employee", allUsers);
        }
}

allUsers.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<body>

<h1>User page</h1>
<ul>
<c:forEach items="${employee}" var="user">
   <li>${user.id}</li>
   <li>${user.name}</li>
</c:forEach>
</ul>
</body>
</html>

results.jsp

<%-- <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <table>
        <tr>
            <th>ID</th>
            <th>NAME</th>
        </tr>
        <c:forEach items="${temp}" var="user">

            <tr>
                <td>${user.id}</td>
                <td>${user.name}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html> --%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>List of Employees</title>
</head>
<body>
    <h1 style="color: blue"></h1>

    <form:form action="find" method="post" modelAttribute="hello">
        <table>
            <tr>
                <td>ID</td>
                <td>${hello.id}<form:hidden path="id" name="id" />
                </td>
            </tr>
            <tr>
                <td>Name</td>
                <td>${hello.name}<form:hidden path="id" name="name" />
                </td>
            </tr>
            <tr>
                <td><a type="button" href="/editemp?id=${hello.id}">Update</a>
                </td>

            </tr>
            <tr>
                <td><a type="button" href="/deletetemp?id=${hello.id}">Delete</a>
                </td>

            </tr>
        </table>

    </form:form>
</body>
</html>

searchUsers.jsp

<%-- <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <table>
        <tr>
            <th>ID</th>
            <th>NAME</th>
        </tr>
        <c:forEach items="${temp}" var="user">

            <tr>
                <td>${user.id}</td>
                <td>${user.name}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html> --%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>List of Employees</title>
</head>
<body>
    <h1 style="color: blue"></h1>

    <form:form action="find" method="post" modelAttribute="hello">
        <table>
            <tr>
                <td>ID</td>
                <td>${hello.id}<form:hidden path="id" name="id" />
                </td>
            </tr>
            <tr>
                <td>Name</td>
                <td>${hello.name}<form:hidden path="id" name="name" />
                </td>
            </tr>
            <tr>
                <td><a type="button" href="/editemp?id=${hello.id}">Update</a>
                </td>

            </tr>
            <tr>
                <td><a type="button" href="/deletetemp?id=${hello.id}">Delete</a>
                </td>

            </tr>
        </table>

    </form:form>
</body>
</html>

update.jsp

<%-- <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html> --%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Update Employee</title>
</head>
<body>
    <h1 style="color: blue">List of Employees</h1>
    <form:form method="post" modelAttribute="edit">
        <table>
            <tr>
                <td>ID</td>
                <td>${edit.id}<form:hidden path="id" name="id" />
                </td>
            </tr>
            <tr>
                <td>Name</td>
                <td><form:input path="name" /></td>
            </tr>
            <tr>
                <td><input type="submit" value="save"></td>
            </tr>
        </table>

    </form:form>

</body>
</html>

一切正常,除非用户单击 'Delete',然后出现如上所示的错误。

如“results.jsp”中所述,您在单击“删除”按钮时调用“/deletetemp?id=${hello.id}”。此场景将调用 HTTP GET 请求而不是 HTTP DELETE。 (可以使用浏览器控制台在 header 部分进行验证)

@DeleteMapping 在 RESTful 服务 API 实现的上下文中使用。您可以在 REST 服务调用中显式传递 HTTP DELETE 方法,以执行使用 @DeleteMapping 注释的方法来处理 DELETE 功能。

所以我建议像您对编辑功能所做的那样,通过@GetMapping 处理此执行。