一起养成写作习惯!这是我参加“一神论计划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"}}