00:00
好,前面呢,我们看了一下如何定制错误页面,也就是说最终我们只需要在我们模板引擎文件夹下,或者这些静态资源文件夹下来放一个A文件夹在里边来放上错误状态码对应的页面,那我们这个页面呢,就是定制的错误页面,而且在页面呢能取出相关的错误信息,但是呢,我们说spring boot呢,给我们做了一个自适应的效果,如果说浏览器来访问,那响应的是一个页面在这访问,而如果说是我们其他客户端在访问,哎,我们响应的呢是一串接损数据,那么这串接损数据目前呢是固定的,我们能不能出现我们错误以后呢,响应一串我们自己定制的接损数据。举一个例子,我给这常。Exception,比如呢,我们写一个异常呢,我们就user not exist,我们用户不存在的异常。
01:07
好,我们在这呢写了一个自定义异常,那么为了咱们这异常能抛出去,我们就让它来继承运行时异常就行了,好,我把它的构造器写上来,Alt加insert键啊,这个构造器我用呢啊,我们这个无参构造器啊,它来调用super来传一个message,我就叫用户不存在,好这时呢,我们这个用户不存在的自定义异常,假设呢,我们为了测试简单期间,我们就在hello controller里边假设就是我们这个hello word请求,那么呢,我们让他传一个用户名啊,我们就叫user吧,它呢从请求参数中获取值,我们用request per,好从请求参数中呢,我们来获取user的值,获取来以后呢,我们来说,如果说user.equals啊,等于AAA,哎,我们就叫三个A吧,啊,如果它。
02:07
过来是,那么我们给来through呢,我们抛了一个自定义异常,也就是说当访问哈路请求的时候,有可能呢,会出现这个异常。我来启动一下。我们来访问哈,请求。带上问号,带上user数据,哎,如果一切正常,哎,这是hello word没问题,而我们说如果等于三个A,哎,现在呢,抛了一个异常,但是这个异常呢,又来到了默认的500页面,因为这都是默认定制的,我们要出现我们自己的500页面,那我们就需要。在错误的这个文件夹下来放一个,我就来放一个统一的所有五开头的就叫五叉叉。
03:03
好,我们把这个错误信息呢,也顺便在这都获取一下,诶比如呢,这有状态码,这有时间,包括异常的啊信息我们来获取一下异常的咱们这个。啊,我们这个异常的信息,它的K呢,放的就是包括呢,我们这个异常对象,我们也能获取来。我们把这个关于异常的这些信息,我们都来获取,来异常对象,它放的K呢叫exception。好,添加了新的页面以后呢,我们就得需要重启一下服务器了,CTRLF9来重新编译页面啊是不行的。好,我来再来刷新一下,刷新哎,我们看到来到了我们自己定制的页面,异常的这个类型信息,包括异常的消息提示,以及500状态码,时间戳等等都有,这是我们用浏览器访问,而如果我们来用来打开用其他模拟其他客户端拿这个卖。
04:06
好,我们来访问,哎,他呢给我们响应的是阶层数据,但是呢,在我们实际开发的时候,往往我们抛出我们自定义的这些异常以后,我们不希望说,诶他给我们的这个响应是这一串的,因为这是他们定制的,我们可能呢,由我们自己定制的规则,那我们怎么应出我们自己的数据呢?我可以来一个异常处理,把它也放在这。啊,这个异常处理器呢,专门来处理异常啊,我们就叫my exception handler。My exception看到了,哎,我们的异常处理器在MVC中要成为异常处理器,哎,我们以前的知识,它呢得是一个controller advice,接下来呢,我们要处理什么异常?好,我先写一个handle exception。
05:02
我们要处理异常了,要处理什么异常呢?我们需要用一个注解叫exception handler注解来标注。要处理什么异常呢?处理一个叫user not exist异常。好,我们来把这个异常一处理一下,当然我们也可以来写所有异常,哎,直接在这写exception,我们来处理所有异常,那么把异常的信息我可以在传的时候获取,那么只要出现异常,Spring mvc就会调用我们这个方法把异常对象传进来,那接下来呢,我们要响应成自己的结算数据,怎么办呢?哎,我们来写一个ma。Strip。Object。一个哈希。好,我们给map里边呢,我们可以放一些自定义信息,比如我们也放一个自己的这个状态码,这自己的啊标识码呢,我们就叫user not exist啊,我们跟用户有关的这个异常。
06:04
包括呢,我们再来放一下异常消息,哎,我们也自己来放一个提示啊,比如呢,我们就叫我们把这个异常的get message来活取来放在这,然后呢,我们把这个map return。因为这个map呢,我们需要是一个阶层数据返回,哎,我们先把这个返回值改成我们这个map,所以呢,我在这来标示一下叫response body就行了,这样呢,我来重启一下我们这个服务器。那我们出现错误以后呢,我们来尝试,哎,出现错误,这接下来呢,这个接S数据就是我们自己定制的格式了。但是呢,我们接下来再来访问页面,我们来看一下页面呢,同样也响应出我们自己定制的接损数据,哎,因为呢,我们确实在出现这个异常的时候,响应的是解锁数据。
07:04
这个呢,就是我们第一种异常处理的方式,哎,我们可以利用spring m VC exception handler机制捕获到这个异常以后,将我们要写出去的数据利用response body来写出来,这在我们开发中呢也非常常见,那这个呢,我们来记录一下。但这种的缺点就是说我们看到现在呢,它并不是一个字适应效果,哎,没有没有咱们这个字适应效果,这个自适应效果是什么呢?也就是说如果是浏览器访问返回页面,而如果是啊,我们其他客户端应该返回S数据,但我们现在这么一写死以后浏览器跟客户端返回的都是S数据,来说一下浏览器客户端。D。返回的都是角色,那我如何让它变成自适应呢?其实我们说了spring m VC在错误的自动配置里边有一个叫basic error controltr,它来处理杠error请求,而杠error请求呢,它是一个自适应的浏览器就来返回页面,而服务器呢,如果是其他客户端就来返回结算数据。所以呢,我也想把我当前的这个错误,我让它做成自身应的,我呢就把它除掉。
08:30
我呢,把我们第一种写法我来掉,第一种呢,我们浏览器服务器返回的都是我来把它扩展一下。我们来写第二种。我呢把response body我来干掉,那我想要能自身效果很简单,我给这呢写一个string string写什么呢?我们就来forward。Forward转发,转发到哪呢?我们就转发到杠L转发。
09:01
转发到咱们这个杠error,也就是说呢,原本是将咱们这个map response body写出去的,下个呢,我们转发到杠error请求error controller,给我们进行自适应处理,有返回页面,有返回监测数据,好,那我这个转过来以后呢,我来重新测试一下。我们看接下来来发这个请求,他能不能达到自适应效果。来回车,诶现在呢,我们看到这一块呢,确实是响应页面了,我们再来发送,诶这一块呢,也响应接送数据了,比如说现在自适应效果是达到了,但是问题就在于返回的这个页面,好,我们一会儿再分析,我把这一段代码拿过来,CTRLC。好第二种,第二种,哎,我们出现错误以后,我们来个转发。到。杠L进行自适自适应自适应响应效果处理,那么最终的效果呢,就是这个样子,它虽然是能自适应的,但是跟我们以前还有点不一样,我们以前都是来到我们自己的定制的错误页面,但现在呢,它又成了一个默认的空白页面,空白页面的原因就是由于我们这个错误处理的逻辑这一块呢,要解析错误视图,它没解析到,没解析到啊,其实在这你看啊,我们以前能解析到错误视图状态码,那都是错误状态码,以四开头或者一五开头,而现在呢,都是200,这都是成功了,所以呢,相当于我们这个错误状态码有问题,而这个状态码呢,我们来在这儿我们可以看一下这个error CTR。
10:52
大家来看响应呢,帮他来设置状态码,状态码呢是叫status的value,而status呢是通过这个方法得到的,传入request对象,把它点进来,而request对象里边呢,我们看到,哎,它才是用get at tribute,用这句话得到的,也就是说啊,我们在这儿,我们一定要传入我们自己的错误状态传入。
11:17
传入我们自己的错误状态,也就是说四叉叉五叉叉之类的,要不传的话,那默认就是200了,而要传怎么传呢?就是request域中的一个属性,我把这个拿过来。我把他的这句话,这句话拿过来,这是他来获取状态码的,那我们呢,也就把状态码给他设置上。它这么获取怎么设置呢?我们给咱们请求参数上,我写一个htp request,好我让拿到原生的request对象,我们给request里面settribute设置一个,诶attribute attribute呢,就是它那状态码是什么呢?我们就来写一些四叉叉之类的,比如我就写一个400,好我们设置上自己的状态码以后呢,我再来重启,看能不能来到我们自己定制的错误页面。
12:18
好,还是这个user a请求,原来呢,状态码是200,来到是默认页面,好,我现在回撤了,诶我们发现确实来到我们自己定制的错误页面了,那为了能取出一些信息,我就呢把它改成500,因为我们这个五叉叉页面能取出那些错误消息,你看一下。回车好,现在呢,错误消息也都取出来了,包括呢,我们用浏览器来用其他客户端发送过来,哎,我发现呢,错误消息也都取出来了,而且是自适应效果,那要想到自适应效果呢,我们就这么来做,CTRLC,哎主要呢,就是一定要设置这个错误状态码。
13:01
否则。就不会进入错误页面。错误页面解析流程。好,即使我们是这样,其实呢也有一点问题,什么问题呢,大家来看,我想给他带出去的,我们自己写的code的message数据,其实呢,这一块是没有的,比如我这个message数据呢,我也不叫异常消息,我们就叫,哎,咱们这个用户。出错了,哎,我们随便呢给一个异常,我们呢应该能发现这个异常呢,肯定是带不过去的,我们可以看一下。我来发送。好,这一块呢,Message是人家自己的,这用户不存在,这是咱们这个user not exception里边的这个message,而我们自己带的这个code以及message一个都没有,那我接下来想要做第三种状态,既要能自适应效果,还要呢将我们的。
14:08
定制定制数据,携带数据携带出去,那怎么样将我们这个map里边定制的这俩数据携带出去呢?我们呢,其实可以围绕boot默认的错误处理机制原理。哎,原理里边呢,重要的两个出现错误以后。出现错误以后会来到杠A请求。这个请求呢,会被咱们这个叫base error control来处理,要说呢,哎,我们来记录一下会被base error control处理,而base on controller呢,在处理的时候呢,做了自适应效果,有返回页面返回解锁数据的,但不管怎么返回,它要返回的内容都在哪呢?我们来看一下,如果是页面返回model and,我包含视图地址以及内容,内容呢就是这个model model呢,是来在这调用get error a垂S得到的,包括呢,即使是咱们这responsibility body也一样,我们这个要响应出去的是一个map数据,这个map呢,也是由这个body得到的,也就说这个get error attribu得到的比是说呢,我们来说一下,会被它反响应出去的数据响应出去。
15:34
可以获取的数据是由是由咱们这个方法得到的,它得到的,而他呢,点进来我们可以发现一下,诶,Get error attributes点进来它呢,其实是error controller,也就是best error controller的负类,哎,它是。哎,这个方法呢,是它规定的方法,而我们这个best error controller,我们来看之前的我们错误处理机制,我们spring BOO呢,默认它给容器中添加了很多组件,其中就有BI error controller,它是处理我们error请求的,我们来看一下之前的这个,哎,这一块呢,他填了一个叫base on control,但是呢,他填的规则叫condition on Miss being,也就是说当容器中没有error controller这个组件的时候呢,就用它默认提供的,而error controller就是我们这个am error controller,哎。
16:39
看一下。哎,他的呢,就是他也就是说我们第一种办法,我们想要定制我们这个异常处理逻辑啦,等等等等,那第一种办法呢,就是我们可以完全。我们完全来编写一个error controller的实现类。实现类放在容器中。
17:04
接下来呢,那错误处理的规则就按照我们这个类,当然这个编写它的时间类太麻烦了,那或者呢,我们是来或者是编写咱们这个继承的编写stra error controller的子类,这样的话呢,我只需要重写上一两个方法,比如呢,我就来重写一个,哎,它呢在这要返回我们页面的,我把这个方法也重写一下,或者呢,它要返回监测数据的,我把这也重写一下,那么页面到底要带哪些数据,我在我自己的方法里边来定义,这是第一种办法,但是这种办法呢也可以,当然太复杂了,我来看第二种办法。第一种。当然呢,可以来尝试第一种办法,我来第二种办法。不管是给页面要携带的数据还是接数据,我们看到给页面要携带的呢是model,诶,Model给咱们这个response body要携带的这个数据呢是map map呢就是这个body,而这个model呢,它是通过这个相当于get attribute方法得到这个map,而body呢,也是通过get attribute方法得到这个map,这就像我们之前说的一样,而这个get attribute方法我们看在里边呢,它其实是用error attribute get attributes。哎,我们把这个。
18:25
来,拿过来。第二个第二个原理呢,就是页面上能用的数据,或者是咱们这个JS返回能用的数据。都是通过它得到的,比如果我们来能把它变一下,那我们也能变到这个逻辑,而它是什么呢?Error attributes点过来,它是一个叫error attribute error attbutes是什么?其实就是我们spring m VC,大家来看给容器中呢,也是condition啊,Miss being在配置错误自动配置的时候,如果容器中没有error attributes这个组件,它填一个默认的error atribu,哎,也就是说呢,相当于我们这个容器中。
19:16
容器中。咱们这default error attributes,默认来进行咱们这个数据处理的呢,要输出哪些数据,都是通过调用它的。这个方法,它的这个方法,那么而且呢,它给容器中加也是叫conditional啊,Miss be,容器中没有才加它,我们点进来,我们来看它的这里边呢,Get a attributes,就是我们之前分析的能有哪些数据,他搞了一个map,给map里边放了时间戳,包括放了状态码等等,放了一大堆,那我们不想用它的,我们可以自己来写一个,好,我们呢,我就来自己写一个,我们就叫MY。Error at tributes,我们自己在整数据的时候呢,不只是,哎,为了简单起见,我就直接来继承这个default,哎,它已经写好的这个,因为呢,我们要把它加在容器中才能起作用,也就说呢,我们给容器中。
20:17
加入我们,加入我们自己定义的咱们这个错误属性,哎,什么error attributes这个东西,然后呢,我们这儿就能用到了,不用默认的,而我们自己呢,我来重写上一个方法或CTRL加O,这呢有一个方法叫get error attributes,获取错误的属性。好,我先调它的负方法。负类的方法好,负类的方法呢,会帮我们来等一下。好,会帮我们来返回一个这个map,我们把这个map返回就行了。而这个里边呢,比如我自己外上两个东西,比如公司个谷,每一个错误的请求都有一个公司的标识信息等等等等,哎,这就是随便填一个我们来看啊。
21:15
接下来呢,我们再来启动,我来发请求。原来的这些错误信息呢,只有这几个字段,我现在再来发,哎,我们发现我们现在呢,加上了自己的字段,比如说呢,我们可以这么来做,哎,我们写一个。诶,我在这儿。这就我们这个自定义,自定义咱们这个error attribute,改变默认行为这个。然后自定义我们这个error attributes自定义啊。自定义它,自定义它就行了,但是呢,我现在想要输出的内容可不只有company,而且呢,还有我在这进行异常处理,我们来看啊,异常的handle了呢,还放了一个code以及message,我要把这两个信息带过来,怎么做呢?我可以这么来做,我把这个map呢,我放在request域中,Tribute,比如呢,我们扩展的数据我就叫T,我把这个map呢放进来,然后呢,我们来到my I attribu,因为我们最终转发给错误的处理器,错误处理器呢,从我们这里边获取一个map,这个map呢就是哎,这个慢,哎返回的map就是页面和接S能获取的所有字段。
22:40
而在这个返回这个map的方法传参上有一个request和attributes,这个呢,其实就是包装了和对象的,哎,一个对象我们把它拿来,这个request对象呢,它有get和tribu,就是呢,我们可以从请求域中获取一个属性来获取谁呢?哎,因为我们之前异常处理的时候,把我们额外要添加的信息放在了EST里边,那么我们在这里来获取我们这个EST。
23:11
但是呢,这个方法呢,得传两个参数,你要从哪个里边获取,这有一个scope scope呢有这几种,第一个叫request,哎,我们传入零就是代表从request域中来,这也是从session域中,好,我们就来传入零,我们直接从请求域中来获取我们的这个。就行了,我们获取到呢是一个map。好,这个呢,我们来给它强制类型转换一下,好,强制类型转换一下,然后呢,这就是我们,哎,我们我们的啊,异常处理器,异常处理器携带的数据,咱们异常处理器呢,在这携带的,包括呢,既然能从request域中获取,也就是当次请求你在任何处携带的,我都可以在这儿拿到,然后呢,我们就把它放进整个要返回的这个map中,第二它来我们呢,把整个EST这个对象能放过来,接下来呢,我来重启,那我们接下来看到的效果呢,就是不止页面能自适应,我们还能在我们自己的异常处理器里边,我们额外添加一些数据,最终呢,都能响应过来,我们可以看一下。
24:33
好,我先发这个,诶我们看到呢,这是spring boot默认的规则啊,这是我们通过定制error attribu我们添加的字段,这是呢,我们这个异常处理器,我们给我们额外带的两个字段,在这呢能获取出来,那当然在页面,哎,在页面,在页面呢,我们也可以来取出来,我就来取出咱们这个,我们来到五叉叉页面,我们就来取一个就行了。
25:02
取谁呢?我们就来取出我们这个扩展的信息,Extend,那我们EST里边有一个code,包括EST里边也有一个message,我们把这个扩展的内容的我们也取都取出来,CTRLF9,好,我们来刷新一下这个页面,诶我们看到呢,这一块也都能取出来,所以呢,我最终做了一个啊,强大的效果。就是说呢,最终的效果。呢,我们这个响应是自适应的。可以通过定制error attribute。改变需要返回的内容,这个呢就是我们来定制错误的响应,主要呢希望大家也来掌握我们最后的这种,通过自定义I tribu的方式,我们可以随心所欲的定制我们需要输出的数据。好这个。
26:03
笔记记录在这。
我来说两句