默认的异常页

浏览器客户端 发生error

500报错 (text/html页面)

image-20230426184115683
image-20230426184115683

404报错 (text/html页面)

image-20230426184212061
image-20230426184212061

Postman 报错

500报错 (Json数据)

image-20230426200911775
image-20230426200911775

404报错 (Json数据)

image-20230426200946513
image-20230426200946513

源码

org.springframework.boot.autoconfigure ->

web ->

servlet ->

error -> ErrorMvcAutoConfiguration

在配置类ErrorMvcAutoConfiguration中,由其注解可知

@EnableConfigurationProperties({ ServerProperties.class, WebMvcProperties.class })

可以在配置文件中通过其前缀来修改该异常配置类的配置。

该配置类中的两个Bean可以看出,第一个errorAttributes为错误属性;

basicErrorController为控制器,来处理请求。

@Bean
@ConditionalOnMissingBean(value = ErrorAttributes.class, search = SearchStrategy.CURRENT)
public DefaultErrorAttributes errorAttributes() {
   return new DefaultErrorAttributes();
}

@Bean
@ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT)
public BasicErrorController basicErrorController(ErrorAttributes errorAttributes,
      ObjectProvider<ErrorViewResolver> errorViewResolvers) {
   return new BasicErrorController(errorAttributes, this.serverProperties.getError(),
         errorViewResolvers.orderedStream().collect(Collectors.toList()));
}

BasicErrorController中,可以看到使用了注解@Controller@RequestMapping

@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")

而在之前的错误信息中,发送的请求是/error

所以BasicErrorController就是来处理/error请求的。

BasicErrorController中标注了@RequestMapping的方法,第一个(用于浏览器端):

image-20230426202435448
image-20230426202435448

第二个(Psotman机器客户端):

image-20230426202518337
image-20230426202518337

ErrorMvcAutoConfiguration的源码中,类WhitelabelErrorViewConfiguration中配置了默认错误页面。

protected static class WhitelabelErrorViewConfiguration {
......
}

image-20230426203231308
image-20230426203231308

当发起错误请求,没有自定义异常来处理,则由BasicErrorController来处理,会检测媒体类型,如果是html页面,没有自定义的错误页面,就会使用默认配置的html页面;若是Postman等机器客户端发起的错误请求,则响应一个Json数据(return new ResponseEntity<>(body,status))。