环境
springboot项目 项目中没有配置/ccc的处理器
问题
发现当请求没有对应的处理器的时候会跳转到/error.
源码分析
请求抓包org.springframework.web.servlet.DispatcherServlet#doDispatch 直接看到处理器是ResourceHttpRequestHandler,这个处理器是资源管理的, 接着走到ResourceHttpRequestHandler处理器里面,org.springframework.web.servlet.resource.ResourceHttpRequestHandler#handleRequest,但是没有对应的资源, 层层返回每个阀门,当回到StandardHostValve时,会去获取response的status如果response是错误转状态则继续去获取错误码对应的ErrorPage,如果没有定义则获取默认的ErrorPage(/error),并重定向/error请求。 然后就会请求到/error了…
解决
实现ErrorPageRegistrar类,然后添加对应错误码的路径,然后新建对应路径的处理器即可;
import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.ErrorPageRegistrar;
import org.springframework.boot.web.server.ErrorPageRegistry;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
@Component
public class ErrorPageConfig implements ErrorPageRegistrar {
@Override
public void registerErrorPages(ErrorPageRegistry errorPageRegistry) {
ErrorPage e404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error/404");
ErrorPage e500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500");
errorPageRegistry.addErrorPages(e404, e500);
}
}
新建对应的处理器
import com.study.springbootplus.domain.param.ResponseResult;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/error")
@ResponseBody
public class ErrorController {
@GetMapping(value = "/404")
public ResponseResult error_404() {
return ResponseResult.fail("404");
}
@GetMapping(value = "/500")
public ResponseResult error_500() {
return ResponseResult.fail("500");
}
}
这时候请求就会走到/404,然后返回对应的错误信息…
|