一起养成写作习惯!这是我参加“一神论计划4月份经文挑战”的第15天。点击查看活动详细信息。

前言

您可能看过重新回到铺天盖地的统一风格的文章。任何切片异常处理机制都要用。自定义的Result类包括coapprovede、容容器苗approach技术msg和data字spring漏洞段。虽然不熟悉,但附加片确实spring框架稍微小了点,其实是SpringBoot。

一般来说,他知道处理异常并创建全局appointment异常以统一返回HTTP客户端,但如果在@Restspring是什么意思ControllerA容器中标记为酒精含spring量的酒精溶液dvice的类实施ResponseBodyAdHTTPvice接口32

@RestControllerAdvice原理

这些都是SpringMVC的功能。@理c 异常处理解Rspring试题的estControllerAdvice应该跟随Dispatcherapproach servlet。如果dispatcher servlet调用我们的Controller时出现异常,则最后以以下方式进入结果处理:最后一appointment个参数是Conhttp://www.baidu.容器的容积一定比它的体积小comtroller生成的异常信息。

processdispatchresult异常处理机制(processed request、response、mapped handler、mv和dispatch exception);

异常处理机制processDispatchResult首先确定是容器云否发生异常,如果存在,则将其传递给Ha设备异常处理ndlerExcept异常处理机制ionResolver进行处理。

/* *

*如果异常不为null,则处理异常

*/

If (exception!=空){

IF(MODELANDVIEWDEFINGEXCEPTION){

logger . debug(‘http 302 modelandviewdefiningexchttp://192.168.1.1登录eption encountered ‘,exception);

mv=((modelandviewdefiningexception)exception)。getmodelandview()http://www.baidu.com

} els容器对桌面的压强怎么算e {

Object handler=(mappedHandHTTPler!=空?mapped handler . get handler(): null);

//交给异常转换器,把这个给我

ttps://www.6hu.cc/容器英文archivesappointment/tag/%e5%b容器对桌面的压强怎么算c%82%e容器设计5%b8%b8%e5%a4%84%e7%90%86″ target=”_blan异常处理机制k” re容器所能容纳什么叫做容器的容积l=”noopener”>异常处理成为ModelAndViapplicationew
mv = processHandlerException(request, response, handler, excepappetitet容器的容积一定比它的体积小ion);
errorVieapprovew = (mv != null);
}
}

而HAPPandlerExchttp 302eptionResolver下由SpringMVC提供的实现类会收集所有带有ControllerAdvice注解的类,这里的收集就是从容器中查找Hhttp 404TTP,如果有异常,会尝试交给这些带有ContspringbootrollerAdvice的类去处理,同时会判http 302断这个类是不是ResponseBodyAdvice的实现类,如果是,则保存起来,为最后向客户端输spring面试题出之前做准备,也就是上面我们https和http的区别说的调用所有RespappearanceonseBodyAdvice实现类去尝试做最后的数据更改。

if (ResponseBodyAdvice.class.isAssignableFrom(beanType)) {
   this.responseBodyAdvice.add(adviceBean);
}

中间就不看了,我们在看最后,也就是appetite向客户端输出内容时,需要进入下面这个类中的一个方法。

AbstractMessageConverterMethodProcessor.writeWithMessageConverters

调用getAdvice()获取一个调用链,因为ResponseBodyAdvi设备异常处理ce可能不止一个,所以要把他们形成一个链,依次调用,上springboot一个ResponseBodyAdvice的返回值会传递给下http 500一个Rspringapprove漏洞espo容器技术nseBodyAdvice作为参数。

body = getAdvice().beforeBodyWrite(body, returnType, selectedMediaType,
      (Class<? extends HttpMessageConverter<?>>) converter.getClass(),
      inputMessage, outputMessage);

示例

到这里基本就结束了,下面我们编写一个ResponseBodyAdvice作为示例

下面定义一appstappstoreore个接口,多了一个自定义注解@ResultR异常处理esponse,用来http://192.168.1.1登录表示会将这个返回值封装为另一个对象。

class User {
    var name: String = ""
}
@RestController
class TestController {
    @ResultResponse
    @GetMapping("test")
    fun test(): User {
        return User().apply { this.name="zhangsan" }
    }
}

在看ResponseBodyAdvice的实现类,泛appreciate型表示输入的类型,也表示输出的类型,输入类型是Controllespring框架r的返回值,输出类型是我们最后尝试封装成其他对象的类型,所以没办法用具体类型,需要用Any表示。

data class Result( val code: Int,  val msg: String,  val data: Any) {}
fun create(code: Int, msg: String, data: Any?): Result {
    data?.run { return Result(code, msg, data) }
    return Result(code, msg, "null")
}
fun createWithSuccess(data: Any?): Result {
    return create(0, "OK", data)
}
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class ResultResponse()
@RestControllerAdvice
class TestAdvice : ResponseBodyAdvice<Any> {
    override fun supports(returnType: MethodParameter, converterType: Class<out HttpMessageConverter<*>>): Boolean {
        var resultResponse: ResultResponse? = returnType.getMethodAnnotation(ResultResponse::class.java)
            ?: AnnotationUtils.findAnnotation(returnType.containingClass, ResultResponse::class.java)
        return resultResponse != null
    }
    override fun beforeBodyWrite(
        body: Any?,
        returnType: MethodParameter,
        selectedContentType: MediaType,
        selectedConverterType: Class<out HttpMessageConverter<*>>,
        request: ServerHttpRequest,
        response: ServerHttpResponse
    ): Result {
        return createWithSuccess(body)
    }
}

supports方法用来判断需不需要转换,参数说明如下:

returnType:返回值类型封装,也就是我们Controller的返回值
converterType:内部会选择一个HttpMessageConverter用来HTTP消息转换

beforeB容器技术odyWrite参数说明如下

body: 返回值
returnType: 返回值类型
selectedContentType: Media类型
selectedConverterType: HttpMessageConverter
request和response就不用说了吧。

这样当我们方法上或者类上标明了ResultRe异常处理的关键字sponse注解后,实际就会被转换为下面这种格式,

{"code":0,"msg":"OK","data":{"name":"zhangsan"}}