Springboot 定制报错 thymeleaf页面${exception}获取不到
Status:[[${status}]]
timestamp:[[${timestamp}]]
ex...
错误内容
今天在尝试自定义报错类的时候出现了问题,页面上没有显示出excpetion 的具体类型,如下图:
检查了页面获取的时候,也没有拼错,代码如下:
<main role="main" class="col-md-9 ml-sm-auto col-lg-10 pt-3 px-4">
<h1>Status:[[${status}]]</h1>
<h2>timestamp:[[${timestamp}]]</h2>
<h2>exception:[[${exception}]]</h2>
<h2>message:[[${message}]]</h2>
</main>
通过百度大佬们的答案,我获得了如下解决方式,在application.properties文件中添加如下属性:
#获取SpringBoot的异常对象exception
server.error.include-exception=true
效果如图
原理
错误页面的异常信息都是在DefaultErrorAttributes类中进行封装的,它有一个属性是includeException并且默认值是false,在封装exception对象的时候,它通过判断includeException是否为true来决定是否封装,如下:
private final boolean includeException;
public DefaultErrorAttributes() {
this(false);
}
if (this.includeException) {//由于这里为false,所以exception对象没有被put到errorAttributes(它是一个Map)中
errorAttributes.put("exception", error.getClass().getName());
}
在application中进行配置即可~
7.30更新
今天继续自定义报错的问题,自定义了类继承了DefaultErrorAttributes,但是在application文件中配置了
server.error.include-exception=true
页面依然出现了上述问题,即无法显示属性${exception}
百度了之后获得了解答
由于在DefaultErrorAttributes的子类MyErrorAttributes 调用了super()
导致includeException被设定了为了false,所以需要将includeException设定为true即可
@Component
public class MyErrorAttributes extends DefaultErrorAttributes {
public MyErrorAttributes() {
//将includeException=true传给DefaultErrorAttributes,使得能获取出exception对象
super(true);
}
@Override
public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);
map.put("author","pf");
/*
* int SCOPE_REQUEST = 0;
* int SCOPE_SESSION = 1;
* */
Map<String,Object> ext = (Map<String,Object>)webRequest.getAttribute("ext", 0);
map.put("ext",ext);
return map;
}
}
然后${exception}又重新出现啦
参考文章
https://blog.csdn.net/qq_40634846/article/details/107480759
https://blog.csdn.net/qq_40634846/article/details/107494294
本文地址:https://blog.csdn.net/sinat_37685617/article/details/107658308