【问题标题】:PostMapping errors asking for GetMapping要求 GetMapping 的 PostMapping 错误
【发布时间】:2019-10-25 05:26:26
【问题描述】:

我正在尝试将数据保存到我的 Postgres 数据库。这应该在方法上使用 PostMapping 注释,以便相应地发送对象。但是,由于某种原因,它需要一个“GET”方法。任何想法以及其他人是否遇到类似问题。我也无法调试该方法。

Inventory.java

@RestController
public class InventoryController {
    @Autowired
    private InventoryService inventoryService;

    @RequestMapping(value="/add", method=RequestMethod.POST)
    public Inventory addItem(@RequestBody(required = false) Inventory item) {
        System.out.print("This is a test");
        return inventoryService.save(item);
    }

    @GetMapping(path="/test")
    @ResponseBody
    public String testMethod() {
        return "Method works!";
    }
}

堆栈跟踪

出现意外错误(类型=不允许的方法,状态=405)。 不支持请求方法“GET” org.springframework.web.HttpRequestMethodNotSupportedException: 不支持请求方法“GET” org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:201) 在 org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:421) 在 org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:367) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.getHandlerInternal(RequestMappingHandlerMapping.java:449) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.getHandlerInternal(RequestMappingHandlerMapping.java:67) 在 org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:393)

我在“addItem”方法上尝试了以下注释,它仍然返回上述跟踪。

  1. @RequestMapping(value="/add", method=RequestMethod.POST)
  2. @PostMapping(path="/add")

我正在运行 Spring Boot 2.2.0.RELEASE

【问题讨论】:

  • 您确定前端调用的是 POST 方法而不是 GET 吗?我怀疑
  • 你能发帖吗,你正在调用什么 API 或 curl 请求?
  • 天哪。我得去睡觉了。我正在使用浏览器到达终点。代码没有问题,而是使用的应用程序有问题。我下载了 Postman 并执行了请求,没有“GET”请求方法就到达了终点。

标签: spring-boot annotations http-post


【解决方案1】:

不是要求GetMapping,错误提示Request method 'GET' not supported。这意味着您调用 HttpGet 方法的端点,但您在 Controller 中定义的端点是 HttpPost 方法!

使用 curl 调用,应该如下所示:

curl -d "param1=value1&param2=value2" -H "Content-Type: application/json" -X POST http://localhost:8080/add

【讨论】:

    【解决方案2】:

    您不需要添加@ResponseBody,因为@RestController 是@Controller 和@ResponseBody 的组合。在将 API 端点移交给前端或移动团队之前,还可以尝试测试来自 PostMan 类似工具的代码。

    例子:

    @RestController
    @RequestMapping(value = "/users")
    public class UserController {
    ...
    ...
    
    @GetMapping
    @PreAuthorize("hasRole('ADMIN')")
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }
    
    }
    

    有时,如果我们通过 Id 获取任何特定资源,那么我们应该检查资源是否为空而不是返回空白对象或标准 NOT_FOUND 错误,我们可以使用从 ResponseEntityExceptionHandler 扩展的 @RestControllerAdvice 覆盖错误,我们可以在控制器级别扩展所有错误.

    但是如果资源服务器出现错误,那么在这种情况下,我们必须在 websecurity 配置中添加入口点 -> http 安全方法覆盖并添加自定义入口点以及失败和成功处理程序。

    【讨论】:

    • 我认为这不是答案,而是编码建议。
    猜你喜欢
    • 2022-01-07
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 2019-04-08
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    相关资源
    最近更新 更多