在SpringMVC默认容器页面的定制化的使用中发现,使用postman发送请求时获得的返回的404错误的值并不是我们自定义的值。
分析源码发现**/error**请求最终被BasicErrorController
类处理:
BasicErrorController
中public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response)
方法负责处理来自浏览器(接收text/html格式文件)的请求,public ResponseEntity<Map<String, Object>> error(HttpServletRequest request)
方法负责处理来自软件等的请求。
因此在SpringMVC默认容器页面的定制化的实现有很大的限制。
但是分析源码发现:
该类在ErrorMvcAutoConfiguration
类中被装配,
@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()));
}
且ErrorMvcAutoConfiguration
类继承AbstractErrorController
类,
而AbstractErrorController
类实现ErrorController
接口
所以可以通过创建一个实现ErrorController
接口的控制器来阻止basicErrorController
的装配,以此来实现定制页面的效果。
例如:
package com.aion.webdemo.controller;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
/**
* 自定义异常
*/
@RestController
@RequestMapping("${server.error.path:${error.path:/error}}")
public class CustomErrorController implements ErrorController {
/**
* 处理浏览器发送的请求
* @return
*/
@RequestMapping()
public String error(HttpServletRequest request){
Integer statusCode = (Integer) request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
return String.valueOf(statusCode);
}
@Override
public String getErrorPath() {
return null;
}
}
在error方法中通过判断statusCode
的值设置返回值、重定向页面等,以此实现默认容器页面定制