Демонстрация эффекта
Давайте сначала посмотримSpringboot
эффект по умолчанию
доступ через браузер
Клиентский доступ
Фокус! ! !
Однако большая часть кодов компаний не обрабатывается адаптивно, во многом причина в том, что вы ищете в Интернете.Springboot全局异常处理
, ищем такой кусок кода!
@ControllerAdvice
public class MyControllerAdvice {
@ResponseBody
@ExceptionHandler(value = Exception.class)
public ResponseEntity<?> errorHandler(Exception ex) {
// 处理异常
}
}
Настоятельно рекомендуется использовать вашу обычно используемую поисковую систему для повторного поиска, а затем посмотреть код вашей компании, чтобы увидеть, похож ли он на такой фрагмент кода, а затем посмотреть вниз.
Конечно, многие студенты могут сказать, что мы уже договорились с клиентом, и нам останется толькоjson
, возврата не будетhtml
место действия. Так что, если вы не сделаете эту адаптацию, это на самом деле не проблема. Но если вы одноклассник по инфраструктуре, вы должны сделать эту функцию, потому что вы связываетесь с бизнес-отделом всей компании, это может сделать Springboot, вы можете сделать аналогичные базовые компоненты, если функция хуже, чем Springboot, вы можете Что думают одноклассники по бизнесу?
Конечно, для большинства студентов не делать это не является большой проблемой.
Но тогда вы упустите прекрасную возможность обучения. Какие возможности обучения? Потому что многие студенты всегда говорят, что на собеседовании по сборке ракеты, если на работе столкнешься с проблемами, в которых не разбираешься, можно просто нажать Baidu или Google. Однако этот вопрос вам не так просто найти. Другими словами, подавляющее большинство людей программируют для поисковых систем, и когда они сталкиваются с проблемами, которые поисковые системы не могут решить, пришло время отразить свою ценность и дорожить ею.
Я не думаю, что важно использовать эту функцию или нет.Эта драгоценная возможность проявить способность решать проблемы действительно редка.В конце концов, это правда, что большинство функций действительно простые поиски, или они могут быть решены спрашивайте в группе обмена.
адаптивный принцип
Многие студенты сказали, что, поскольку они не могут его найти, им следует запустить волну исходного кода. но,Springboot
Есть так много исходных кодов, с чего я могу начать? В этом суть! В это время мы можем принять волну официальных документов.
27.1.9 Error Handling
Spring Boot по умолчанию предоставляет сопоставление /error, которое разумно обрабатывает все ошибки и регистрируется как «глобальная» страница ошибок в контейнере сервлета. Статус HTTP и сообщение об исключении. Для клиентов браузера существует представление ошибок «белая метка», которое отображает те же данные в формате HTML (чтобы настроить его, просто добавьте представление, которое разрешается как «ошибка»). Чтобы полностью заменить поведение по умолчанию, вы можете реализовать ErrorController и зарегистрировать определение bean-компонента этого типа или просто добавить bean-компонент типа ErrorAttributes, чтобы использовать существующий механизм, но заменить содержимое.
Некоторые студенты сказали, не может понять английский язык? Я выберу для вас 5 ключевых слов. Это все слова из начальной школы. Если вы закончите начальную школу, я думаю, вы сможете их понять.
clients JSON browser HTML ErrorController
Фэй Чао мягко надавил: здесь подчеркивается, что это не означает, что чтение официальных документов — лучшее решение проблемы. Опять старый драйвер看菜吃饭
Да, способов решения проблемы много, а время ограничено, поэтому я не буду перечислять все способы по одному (на самом деле боюсь, что если я расскажу вам все способы, вы бросите! ), сразу переходите к теме.
Из документов и начальных школьных английских слов, на которые мы нацелилисьErrorController
, показать вам код ключа
@Controller
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {
@RequestMapping(produces = "text/html")
public ModelAndView errorHtml(HttpServletRequest request,
HttpServletResponse response) {
HttpStatus status = getStatus(request);
Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(
request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
response.setStatus(status.value());
ModelAndView modelAndView = resolveErrorView(request, response, status, model);
return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);
}
@RequestMapping
@ResponseBody
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
Map<String, Object> body = getErrorAttributes(request,
isIncludeStackTrace(request, MediaType.ALL));
HttpStatus status = getStatus(request);
return new ResponseEntity<Map<String, Object>>(body, status);
}
}
Отсюда можно примерно догадаться, что делать адаптивную глобальную обработку исключений теоретически написано так.
@ControllerAdvice
public class MyExceptionHandler {
@ExceptionHandler(Exception.class)
public String handleExceptionHtml(Exception e, HttpServletRequest httpServletRequest) {
// 这里做一些你自己的处理,比如
httpServletRequest.setAttribute("欢迎关注微信公众号","肥朝");
return "forward:/error";
}
}
Конечно же, после волны отладки выяснилось, что это так. Конечно, как настроить этот интерфейс ошибок и тому подобное, можно найти в Интернете, поэтому Фей Чао не занимается этим. Итак, это адаптивное глобальное исключение кажется красивым?
Столкнуться с проблемами
Мы знаем принцип этой адаптивной глобальной обработки исключений, и легко понять, как создавать ошибки. Например, если у вас есть исключение в перехватчике.
@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
throw new RuntimeException("这里假装抛出一个肥朝异常");
//return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
});
}
}
потом появится,StackOverflowError
.
Поскольку в перехватчике возникает исключение, оно попадет в вашу глобальную обработку исключений, а затем ваша глобальная обработка исключений продолжится снова.forward
, снова входит в перехватчик и продолжает цикл.
Итак, как решить эту проблему? Давайте посмотрим трюки, а пока я хочу продемонстрировать несколько распространенных.不优雅
, но обычно всем легко писать.
жестко прописать конфигурацию
registry.addInterceptor(new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
throw new RuntimeException("这里假装抛出一个肥朝异常");
//return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}).excludePathPatterns("/error");
мы начинаем с
@RequestMapping("${server.error.path:${error.path:/error}}")
Узнал здесь, этоerror.path
Его можно настроить, многие студенты быстры,excludePathPatterns
написано до смерти/error
, так что можно без проблем использовать все время значение по умолчанию, как только кто-то его настроитerror.path
, существует проблема.
Негласные правила
Эта проблема с негласным правилом является наиболее распространенной проблемой для большинства студентов, занимающихся написанием кода. Подумайте об этом, ваше адаптивное глобальное исключение решено, но последствия таковы, что каждый перехватчик должен быть добавленexcludePathPatterns
такая конфигурация. Для пользователя это нужно добавить с определенной настройкой, что является негласным правилом, а для нового коллеги он этого не знает潜规则
,однажды潜规则
Кода много, и его сложно поддерживать в будущем.
расширить мышление
Так как же должен выглядеть негласный код?
Конечно, часто у нас должны быть негласные правила! Например, изучающие большие данные требуют, чтобы отправляемые журналы имели имя приложения. Затем для бизнес-стороны он должен настроить имя приложения. Итак, как сообщить коллегам по бизнесу это негласное правило. Конечно, многие студенты сказали, что они должны прямо сказать коллегам, чтобы они добавили те или иные параметры. Вы даже не помните, чтобы читать ежедневные твиты Фей Чао, можете ли вы гарантировать, что каждый коллега будет помнить?
Подводя итог, мы столкнулись с такой проблемой:
1. Нам нужно сделать некоторые параметры негласных правил для перехватчика, такие как эта статья, как элегантно негласные правила?
2. Например, у перехватчика есть требования к порядку, такие как наша базовая структура определяетtraceInterceptor
Перехватчик, этот перехватчик надо ставить первым. Итак, вопрос в том, как вы можете гарантировать, что это самое передовое. Некоторые одноклассники сказали, что я использую@Order
контроль. Затем я также пишу перехватчик, как и вы, называемыйfeichaoInterceptor
,Код точно такой же как у вас.Раз он точно такой же,как вы можете гарантировать,что ваш лучше моего?
3. Для сцен, которые должны быть невысказанными, как вы можете проникнуть, даже если будете сопротивляться?
На эти вопросы наш официальный аккаунт ответит в следующем выпуске.