【问题标题】:I've been getting this error in my Postman (POST and DELETE come out with this error), hoping someone could resolve this我在我的 Postman 中遇到了这个错误(POST 和 DELETE 出现了这个错误),希望有人能解决这个问题
【发布时间】:2020-05-05 14:22:44
【问题描述】:
"timestamp": "2020-01-19T08:36:05.729+0000",
    "status": 405,
    "error": "Method Not Allowed",
    "message": "Request method 'POST' not supported",
    "trace": "org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported\r\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:201)\r\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:421)\r\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:367)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.getHandlerInternal(RequestMappingHandlerMapping.java:449)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.getHandlerInternal(RequestMappingHandlerMapping.java:67)\r\n\tat org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:395)\r\n\tat org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1234)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1016)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)\r\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\r\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:660)\r\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:741)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)\r\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)\r\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)\r\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)\r\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\r\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)\r\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)\r\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\r\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)\r\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598)\r\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\r\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\r\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\r\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\r\n\tat java.lang.Thread.run(Unknown Source)\r\n",
    "path": "/automobil/6"
}

trace 值转义为:

org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported
    at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:201)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:421)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:367)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.getHandlerInternal(RequestMappingHandlerMapping.java:449)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.getHandlerInternal(RequestMappingHandlerMapping.java:67)
    at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:395)
    at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1234)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1016)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    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:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

这是我的控制器类

@Autowired
private AutomobiliDaoService service;

@GetMapping(path = "/automobil")
public List<PolovniAutomobili> getAll() {
    return service.findAll();
}

@GetMapping(path = "/automobil/{id}")
public PolovniAutomobili getAutomobili(@PathVariable int id) {
    return service.findOne(id);
}

@RequestMapping(method = RequestMethod.POST, value = "/automobil")
public void addAutomobili(@RequestBody PolovniAutomobili polovniAutomobili) {
    service.addAutomobil(polovniAutomobili);
}

@RequestMapping(method = RequestMethod.DELETE, value = "/automobil")
public void deleteAutomobili(@RequestBody PolovniAutomobili polovniAutomobili) {
    service.deleteAutomobil(polovniAutomobili);
}

这是我的组件类

public static List<PolovniAutomobili> automobil = new ArrayList<>();

    static {

        automobil.add(new PolovniAutomobili(1, 2012, "Polo", "Volkswagen", 75.00));
        automobil.add(new PolovniAutomobili(2, 2018, "Arteon", "Volkswagen", 155.00));
        automobil.add(new PolovniAutomobili(3, 2006, "Clio", "Renault", 55.00));
        automobil.add(new PolovniAutomobili(4, 2011, "Punto", "Fiat", 60.00));
        automobil.add(new PolovniAutomobili(5, 2010, "Spark", "Chevrollete", 65.00));

    }

    public List<PolovniAutomobili> findAll() {
        return automobil;
    }

    public PolovniAutomobili findOne(int id) {
        for(PolovniAutomobili polovniautomobili : automobil) {
            if(polovniautomobili.getId()==id) {
                return polovniautomobili;
            }
        }

        return null;
    }

    public void addAutomobil(PolovniAutomobili polovniAutomobili) {
        automobil.add(polovniAutomobili);
    }

    public void deleteAutomobil(PolovniAutomobili polovniAutomobili) {
        automobil.remove(polovniAutomobili);
    }

【问题讨论】:

  • 好奇:如果你使用@GetMapping,为什么使用@RequestMapping(method = RequestMethod.POST)而不是更简单的@PostMapping@DeleteMapping 也一样?
  • 尝试用@PostMapping@DeleteMapping 实现它,但遇到了一些问题,因为我已经从数据库切换到列表,我真的不记得如何使用它们了这样,如果有意义的话
  • 不是真的,不。
  • 既然你提到它,eclipse 真的没有帮我一个忙,现在它与@PostMapping 一起工作,昨天它给了我一个错误

标签: java spring


【解决方案1】:

您正在发布到 /automobil/6,但在您的控制器中,您只有 /automobil 的 POST 映射。

要么将您的数据发布到/autmobil,要么将您的发布映射更改为/autmobil/{id},并使用路径变量作为id。

【讨论】:

  • 我已经尝试将帖子映射更改为 /automobil/{id} ,同样的错误仍然存​​在
  • 您是否在方法中添加了@PathVariable 参数?
  • 哦,抱歉,现在改成“timestamp”:“2020-01-19T09:14:56.145+0000”,“status”:400,“error”:“Bad Request”,“message” ": "缺少所需的请求正文:public void rs.ac.singidunum.singidunumboot.AutomobiliController.addAutomobili(rs.ac.singidunum.singidunumboot.PolovniAutomobili)"
  • 所以您没有在请求中发送数据?
  • 我正在尝试通过设置查询参数(在 Postman 中)中的键和值来添加一个新参数,如果这就是您发送数据的意思吗?
【解决方案2】:

当你想添加新内容时,必须使用POST方法,而当你想检索现有内容时,你必须使用GET方法;当你想删除一个现有的内容时,你必须使用DELETE 方法。


添加新车

你需要一个POST 方法。

@PostMapping("automobil")
public void addAutomobili(@RequestBody PolovniAutomobili polovniAutomobili) {
    service.addAutomobil(polovniAutomobili);
}

您可以像这样在邮递员中提供这些数据(基于您在 cmets 中添加的内容):

删除现有汽车

您需要DELETE 方法。要遵循 RESTfull 准则,最好使用路径变量引用资源。

@DeleteMapping("automobil/{automobilId}")
    public void addAutomobili(@PathVariable Integer automobilId) {
        service.deleteAutomobil(automobilId);
    }

您必须修改组件的 deleteAutomobil 方法(通常称为 Service)。 使用Map 而不是List 可能会更好(因为您管理ID 来识别汽车)。在这种情况下删除也会更容易:

public void deleteAutomobili(Integer automobilId) {
            if(automobilMap.containsKey(automobilId))
                 automobilMap.remove(automobilId);
            else {
               // notify that resource doesn't exists
            }
    }

这是对 Postman 的调用(请注意,这里没有正文):


Map 是一种将元素存储为键值对的结构。您可以通过键访问元素。请记住,每个键都必须是唯一的。 您的服务类应如下所示:

public static Map<Integer, PolovniAutomobili> automobil = new HashMap<>();
static {

    automobil.put(1, new PolovniAutomobili(1, 2012, "Polo", "Volkswagen", 75.00));
    automobil.put(2, new PolovniAutomobili(2, 2018, "Arteon", "Volkswagen", 155.00));
    automobil.put(3, new PolovniAutomobili(3, 2006, "Clio", "Renault", 55.00));
    automobil.put(4, new PolovniAutomobili(4, 2011, "Punto", "Fiat", 60.00));
    automobil.put(5, new PolovniAutomobili(5, 2010, "Spark", "Chevrollete", 65.00));

}

public List<PolovniAutomobili> findAll() {
    return automobil.values();
}

public PolovniAutomobili findOne(int id) {
    // if id is not a ky, it will return null (you can manage it)
    return automobil.get(id);
}

public void addAutomobil(PolovniAutomobili polovniAutomobili) {
    automobil.put(polovniAutomobili.getId(), polovniAutomobili);
}

public void deleteAutomobil(int id) { 
    if(automobil.containsKey(id))
        automobil.remove(id);
    else
        System.out.println("Id not found");
}           

【讨论】:

  • 谢谢你这对我帮助很大,虽然我现在遇到DELETE 无法正常工作的问题,你有时间使用MapList@insted 向我发送完整的更新
  • 我添加了使用Map的代码。让我知道它现在是否正常工作或者您需要更多帮助,没问题 :)
  • 你把public List&lt;PolovniAutomobili&gt; findAll(),不应该删除List,因为我们使用的是Map?抱歉迟到了
  • 别担心!不,因为我返回了automobil.values(),它返回了一个集合(即在这种情况下为List),所以我没有返回地图本身。它只获取地图的值作为列表,而不获取键。
  • 你帮了我很多,谢谢,我会赞成并接受它:D
猜你喜欢
  • 1970-01-01
  • 2022-01-12
  • 2016-02-19
  • 2021-11-02
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
相关资源
最近更新 更多