• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

SpringBoot中干掉Whitelabel Error Page返回自定义内容的实现

springboot 搞代码 4年前 (2022-01-05) 37次浏览 已收录 0个评论
文章目录[隐藏]

这篇文章主要介绍了SpringBoot中干掉Whitelabel Error Page返回自定义内容的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

 1. 引言

SpringBoot中对于错误请求的页面是长这样的,

然而我们在访问在一些网站时,如果请求错误,一般都会有友好美观的提示,比如知乎这个,这比起一堆错误信息要友好的多了。

我们可以根据项目业务来自定义错误请求(RequestMapping中没有映射到的请求)的处理,比如返回自定义错误页面或者Json字符串。

2. 分析

我们看看SpringBoot中对于错误请求是如何处理的。SpringBoot项目中搜索Whitelabel定位到类WhitelabelErrorViewConfiguration,可以看到它是ErrorMvcAutoConfiguration的一个静态内部类,而且正是这个类处理的错误请求的,代码中的defaultErrorView正是我们看到的默认错误页面。

 @Configuration(proxyBeanMethods = false) @ConditionalOnProperty(prefix = "server.error.whitelabel", name = "enabled", matchIfMissing = true) @Conditional(ErrorMvcAutoConfiguration.ErrorTemplateMissingCondition.class) protected static class WhitelabelErrorViewConfiguration { private final ErrorMvcAutoConfiguration.StaticView defaultErrorView = new ErrorMvcAutoConfiguration.StaticView(); @Bean(name = "error") @ConditionalOnMissingBean(name = "error") public View defaultErrorView() { return this.defaultErrorView; } // and so on... }

仔细研究这个代码,我们不难发现,我们至少有两种方法可以替换掉默认的实现自定义错误页面。

入手点1:

 @ConditionalOnProperty(prefix = "server.error.whitelabel", name = "enabled", matchIfMissing = true)

入手点2:

 @Bean(name = "error") @ConditionalOnMissingBean(name = "error")

3. 尝试

3.1 尝试 1

 @ConditionalOnProperty(prefix = "server.error.whitelabel", name = "enabled", matchIfMissing = true)

我们看到server.error.whitelabel.enabled控制了这个类是否装配,我们可以在配置中将其设为false

 server: error: whitelabel: enabled: false path: /error

该配置类为ErrorProperties,默认的错误请求为/error,将 whitelabel 禁用后在 controller 中定义请求 /error返回自定义内容。

 @Controller public class ErrorController { @RequestMapping("/error") @ResponseBody public R error(HttpServletRequest request) { Integer status = (I<b style="color:transparent">来源gao@!dai!ma.com搞$$代^@码网</b>nteger) request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE); if (Objects.nonNull(status)) { HttpStatus httpStatus = HttpStatus.valueOf(status); return RUtils.fail(httpStatus); } return RUtils.fail("Error"); } }

运行!一顿操作猛如虎,仔细一看原地杵,想法不错,但疯狂报错:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘documentationPluginsBootstrapper’ defined in URL [jar:file:/D:/Environment/Maven/repository/io/springfox/springfox-spring-web/2.9.2/springfox-spring-web-2.9.2.jar!/springfox/documentation/spring/web/plugins/DocumentationPluginsBootstrapper.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘webMvcRequestHandlerProvider’ defined in URL [jar:file:/D:/Environment/Maven/repository/io/springfox/springfox-spring-web/2.9.2/springfox-spring-web-2.9.2.jar!/springfox/documentation/spring/web/plugins/WebMvcRequestHandlerProvider.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘requestMappingHandlerMapping’ defined in class path resource [xxx/xxx/xxx/config/WebMvcConfig.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map ‘basicErrorController’ method
org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error(HttpServletRequest)
to { /error}: There is already ‘errorController’ bean method

具体报错原因未作分析,怀疑是我项目设置有问题,笔者使用的SpringBoot版本是2.3.6.RELEASE,大家可以尝试一些行不行。既然第一个方法尝试接着尝试失败,那就试试第二个吧。

3.2 尝试2

 @Bean(name = "error") @ConditionalOnMissingBean(name = "error")

这个操作更简单,我们只要向IoC 容器中注入一个名为errorBean即可,返回类型为View:

 @Configuration public class MyConfig { @Bean("error") public View error() { ModelAndView view = new ModelAndView(new MappingJackson2JsonView()); return view.getView(); } }

其中new MappingJackson2JsonView()返回的Json字符串的 View ,当然你也可以根据业务需求灵活使用,如果想获取HttpServletRequest可以这样获取,但使用时需要注意判空,因为Bean实例化注入是可能获取不到HttpServletRequest而造成NPE,项目启动失败。

 public static HttpServletRequest getRequest() { return Optional.ofNullable(RequestContextHolder.getRequestAttributes()) .map(r -> ((ServletRequestAttributes) r).getRequest()) .orElse(null); }

结果当然是没问题的,会返回以下信息:

4. 总结

解决问题:

搜索引擎找解决方法深入源码尝试自己解决

到此这篇关于SpringBoot中干掉Whitelabel Error Page返回自定义内容的文章就介绍到这了,更多相关SpringBoot返回自定义内容内容请搜索gaodaima搞代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持gaodaima搞代码网

以上就是SpringBoot中干掉Whitelabel Error Page返回自定义内容的实现的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:SpringBoot中干掉Whitelabel Error Page返回自定义内容的实现

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址