异常统一处理:HttpRequestMethodNotSupportedException(Http请求方法不支持异常)

这篇具有很好参考价值的文章主要介绍了异常统一处理:HttpRequestMethodNotSupportedException(Http请求方法不支持异常)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、引言

本篇内容是“异常统一处理”系列文章的重要组成部分,主要聚焦于对 HttpRequestMethodNotSupportedException 的原理解析与异常处理机制,并给出测试案例。

  • 关于 全局异常统一处理 的原理和完整实现逻辑,请参考文章:
    《SpringBoot 全局异常统一处理(AOP):@RestControllerAdvice + @ExceptionHandler + @ResponseStatus》
  • 本文仅详细解析 HttpRequestMethodNotSupportedException 的异常处理;其他类型异常的原理和处理方法,请参阅本文所在专栏内的其他文章。

二、异常原理

在Spring Boot应用中,HttpRequestMethodNotSupportedException异常是由Spring MVC框架抛出的,当客户端通过HTTP协议发送请求到服务器端时,所使用的HTTP方法(如GET、POST、PUT、DELETE等)与控制器方法所期望的方法不匹配时,就会触发这个异常。

例如,如果你有一个只支持POST请求的RESTful API接口:

@PostMapping("/some-resource")
public ResponseEntity<String> handlePostRequest(...) {
    // ...
}

但客户端尝试以GET方法访问该资源:

GET /some-resource

此时,由于服务器端没有为GET方法配置对应的处理方法,Spring MVC在解析请求并试图找到合适的方法进行处理时,无法找到对应HTTP GET方法的处理器,因此会抛出HttpRequestMethodNotSupportedException异常,并附带信息说明请求的方法不受支持。

解决这个问题的方式是确保客户端使用与服务器端定义的控制器方法相匹配的HTTP方法进行通信。如果需要支持多种HTTP方法,可以使用@RequestMapping注解配合method属性指定多个支持的方法,或者分别使用@GetMapping@PostMapping等注解来明确指定每个HTTP方法的处理器方法。

三、异常处理代码

在Spring Boot应用中,我们可以通过使用@ExceptionHandler注解来捕获并处理HttpRequestMethodNotSupportedException异常。

3.1 异常处理示意图

异常统一处理:HttpRequestMethodNotSupportedException(Http请求方法不支持异常),# 异常统一处理(SpringMVC),异常统一处理,spring boot,SpringMVC

3.2 异常处理核心代码

异常处理策略的核心代码如下:

package com.example.core.advice;

import com.example.core.advice.util.ApiUtil;
import com.example.core.model.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletRequest;

/**
 * 全局异常处理器
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    private final HttpServletRequest request;

    public GlobalExceptionHandler(HttpServletRequest request) {
        this.request = request;
    }

    /**
     * Http请求方法不支持异常。
     * <p>
     * 一个接口,是由【请求方法】(GET、POST、PUT、DELETE等)和【接口路径】两个部分来唯一确定的。
     * 当一个请求,能找到对应的【接口路径】,但是没有找到对应的【请求方法】时,会报异常 HttpRequestMethodNotSupportedException ,进入此异常处理。
     * 当一个请求,找不到对应的【接口路径】时,会直接报错 404 ,不会进入此异常处理。
     * <p>
     * 测试:一个接口,应该用Post请求,却用了GET请求。
     * <p>
     * 报错示例:
     * DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported]
     * <p>
     * 注意:此方法不能包含 HandlerMethod 入参,否则会报错;因为进入此异常处理方法,意味着收到的请求是没有对应的控制器方法的。
     */
    @ExceptionHandler
    @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
    public Result<String> handle(HttpRequestMethodNotSupportedException e) {
        String api = ApiUtil.getApi(request);
        String userMessage = "Http请求方法不支持异常!请稍后重试,或联系业务人员处理。";
        String errorMessage = String.format("HttpRequestMethodNotSupportedException(Http请求方法不支持异常);当前请求接口:[%s];报错信息:%s", api, e.getMessage());
        return Result.fail(userMessage, String.valueOf(HttpStatus.METHOD_NOT_ALLOWED.value()), errorMessage);
    }

}

上述代码中,当出现HttpRequestMethodNotSupportedException异常时,系统将返回一个状态码为405(Method Not Allowed)的结果,并附带具体的错误信息。

3.3 获取当前请求的API

package com.example.core.advice.util;

import javax.servlet.http.HttpServletRequest;

/**
 * API工具类
 *
 * @author songguanxun
 * @since 2024-2-18
 */
public class ApiUtil {

    /**
     * 获取当前请求的API
     */
    public static String getApi(HttpServletRequest request) {
        String method = request.getMethod();
        String uri = request.getRequestURI();
        return String.format("%s %s", method, uri);
    }

}

四、测试案例

4.1 测试代码

package com.example.web.exception.controller;

import com.example.web.model.param.UserAddParam;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

@Slf4j
@RestController
@RequestMapping("exception")
@Tag(name = "异常统一处理")
public class ExceptionController {

    @PostMapping("HttpRequestMethodNotSupportedException")
    @Operation(summary = "异常:HttpRequestMethodNotSupportedException")
    public void testHttpRequestMethodNotSupportedException(@Valid @RequestBody UserAddParam param) {
        log.info("测试:HttpRequestMethodNotSupportedException");
    }

}

4.2 正确请求示例

异常统一处理:HttpRequestMethodNotSupportedException(Http请求方法不支持异常),# 异常统一处理(SpringMVC),异常统一处理,spring boot,SpringMVC

4.3 未处理异常时的报错

请求响应

异常统一处理:HttpRequestMethodNotSupportedException(Http请求方法不支持异常),# 异常统一处理(SpringMVC),异常统一处理,spring boot,SpringMVC

控制台的错误日志

异常统一处理:HttpRequestMethodNotSupportedException(Http请求方法不支持异常),# 异常统一处理(SpringMVC),异常统一处理,spring boot,SpringMVC

4.4 已处理异常时的响应

异常统一处理:HttpRequestMethodNotSupportedException(Http请求方法不支持异常),# 异常统一处理(SpringMVC),异常统一处理,spring boot,SpringMVC

五、触发异常的情景

如下示例中,当请求 删除用户 接口时,前端漏传id参数,导致接口路径变为 [/users];只有新增用户和查询用户列表的接口为 [/users],且请求方法都不是DELETE。最后,就抛出了 HttpRequestMethodNotSupportedException 异常,因为 接口路径[/users]不支持DELETE方法

当出现此种情况时,说明前端调用接口出现了错误,应检查前端请求代码,将id参数补全。

接口示例

异常统一处理:HttpRequestMethodNotSupportedException(Http请求方法不支持异常),# 异常统一处理(SpringMVC),异常统一处理,spring boot,SpringMVC

请求示例

异常统一处理:HttpRequestMethodNotSupportedException(Http请求方法不支持异常),# 异常统一处理(SpringMVC),异常统一处理,spring boot,SpringMVC

异常统一处理:HttpRequestMethodNotSupportedException(Http请求方法不支持异常),# 异常统一处理(SpringMVC),异常统一处理,spring boot,SpringMVC文章来源地址https://www.toymoban.com/news/detail-856229.html

到了这里,关于异常统一处理:HttpRequestMethodNotSupportedException(Http请求方法不支持异常)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot 全局异常统一处理:BindException(绑定异常)

    在Spring Boot应用中,数据绑定是一个至关重要的环节,它负责将HTTP请求中的参数映射到控制器方法的入参对象上。在这个过程中如果遇到问题,如参数缺失、类型不匹配或验证失败等,Spring MVC将会抛出一个 org.springframework.validation.BindException 异常。本文将深入解析 BindExceptio

    2024年01月18日
    浏览(38)
  • 【Spring Boot】拦截器与统一功能处理:统一登录验证、统一异常处理与统一数据返回格式

     Spring AOP是一个基于面向切面编程的框架,用于将横切性关注点(如日志记录、事务管理)与业务逻辑分离,通过代理对象将这些关注点织入到目标对象的方法执行前后、抛出异常或返回结果时等特定位置执行,从而提高程序的可复用性、可维护性和灵活性。但使用原生Sp

    2024年02月16日
    浏览(45)
  • 统一异常处理

    Result为封装传递给前端的包装类 全局异常处理 特定异常处理 自定义异常处理 创建异常类,继承RuntimeException 在异常的地方,手动添加异常 添加执行方法

    2024年02月04日
    浏览(35)
  • spring的异常统一处理

    前情回顾:         首先明确,当你的代码遇到bug时会报错,那报错后不处理就会程序停止运行。 那就需要异常捕获了,两种方法:         一、try...catch...直接自己处理         二、throws 将异常抛给调用者         在spring的框架中,要求就是简洁,在大量的代码中有t

    2024年02月04日
    浏览(37)
  • springboot 统一异常处理 + 日志记录

          在项目的开发中,在某些情况下,比如非业务的操作,日志记录,权限认证和异常处理等。我们需要对客户端发出的请求进行拦截,常用的API拦截方式有Fliter,Interceptor,ControllerAdvice以及Aspect。先简单介绍一下不同的拦截方式。 可以获得Http原始的请求和响应信息,

    2023年04月17日
    浏览(41)
  • springmvc统一异常处理拦截器

    使用@RestControllerAdvice+@ExceptionHandler实现 也可以使用@ControllerAdvice+@ResponseBody+@ExceptionHandler实现 创建一个异常处理的类,放在config包下  组件类:  也可以让不同的异常返回不同的结果,捕获什么异常由@ExceptionHandler的value属性决定,传入一个类对象(可以通过反射获得)  

    2024年02月15日
    浏览(40)
  • springboot优雅的统一返回格式 + 全局异常处理(包括404等异常)

    目录 1.自定义枚举类 2.自定义统一返回格式类 3.统一返回格式的高级实现 4.全局异常处理 5.更优雅的全局异常处理 6.处理404错误 该枚举类为我们和前端约定好的返回状态码和描述信息,可根据自己的需求修改状态码和描述 @Data 注解为Lombok工具类库中的注解,提供类的get、s

    2024年02月11日
    浏览(40)
  • 【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !

    前言: 大家好,我是 良辰丫 ,在上一篇文章中我们已经学习了一些统一功能处理的相关知识,今天我们继续深入学习这些知识,主要学习统一异常处理,统一的返回格式,@ControllerAdvice简单分析.💌💌💌 🧑个人主页:良辰针不戳 📖所属专栏:javaEE进阶篇之框架学习 🍎励志语句:生

    2024年02月16日
    浏览(39)
  • Spring Boot实现统一异常处理的技术解析

    引言 在软件开发过程中,异常处理是非常重要的一环。一个好的异常处理机制可以帮助我们更好地定位问题,提高代码的可维护性和稳定性。Spring Boot作为一款轻量级的Java开发框架,提供了一种简单而高效的方式来实现统一异常处理。本文将详细介绍如何使用Spring Boot实现统

    2024年01月21日
    浏览(41)
  • SpringBoot第14讲:SpringBoot 如何统一异常处理

    本文是SpringBoot第14讲,SpringBoot接口如何对异常进行统一封装,并统一返回呢?以上文的参数校验为例, 如何优雅的将参数校验的错误信息统一处理并封装返回呢

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包