Эгерде исключение билдирүү аткарылып жаткан учурда пайда болсо же суранычты иштетүүчү тарабынан жаралса (мисалы, @Controller
менен анотталган), DispatcherServlet
ыйгарым укуктарды HandlerExceptionResolver
тууралуу маалыматка ээ болгон биндер чынжырчасына өткөрүп берет жана адатта бул иштетүү ката тууралуу билдирүү берген альтернативдүү иштетүүнү камсыз кылат.
Төмөнкү таблицада HandlerExceptionResolver
жеткиликтүү реализациялар тизмектелген:
HandlerExceptionResolver |
Описание |
---|---|
|
Исключение классынын аттары менен ката көрүнүштөрүнүн аттарынын ортосундагы дал келүүлөрдү камсыз кылат. Бул браузерде барактарды көрсөтүү үчүн колдонулат. |
Spring MVC тарабынан жаралган исключениелерди тааныйт жана аларды HTTP статус коддоруна көрсөтөт. Ошондой эле альтернативдүү |
|
|
|
|
Исключениелерди |
Распознавательлер чынжыры
Керек болсо, бир нече HandlerExceptionResolver
биндерин Spring конфигурациясына жарыялоо жана алардын order
касиеттерин ыңгайлаштыруу аркылуу исключениелердин распознаватель чынжырын түзө аласыз. Кандайдыр бир катар сапарлардын ашык болгон сайын, исключениелерди таануучу алыскы жерде жайгашат.
HandlerExceptionResolver
контракты бу жактан кайтара алат:
-
Катаны көрсөтүүчү
ModelAndView
. -
Исключение распознаватель ичинде иштетилген болсо, бош
ModelAndView
. -
Кийинки аракеттер үчүн кайра аракет кылууну камсыз кылуу үчүн
null
, эгерде исключение таанылбаса, бирок акыры ал кайра сервлет контейнеринде кала берүүчү болсо.
MVC конфигурациясы Spring MVC исключениелери үчүн, @ResponseStatus
анотациясы менен белгиленген исключениелер үчүн жана @ExceptionHandler
анотациясы менен белгиленген методдорду колдоо үчүн демейдеги распознавательлерди автоматтык түрдө жарыялайт. Бул тизмени өзгөртсөңүз же алмаштыра аласыз.
Контейнер катасы барагы
Эгер исключение кандайдыр бир HandlerExceptionResolver
тарабынан таанылбаса жана, ошого жараша, параллельдикке өтсө, же жооптун статусу ката жагдайында коюлса (б.а. 4xx, 5xx), сервлет контейнерлери демейки HTML катасы барагын көрсөтө алат. Контейнердин катасы барагын конфигурациялоо үчүн, web.xml
ичинде каталар барагын чагылдыруу жарыяланса болот. Төмөнкү мисал бу документациясыз жыйынтык болгонду кандай жасоону көрсөтөт:
<error-page>
<location>/error</location>
</error-page>
Мурунку мисалды эске алып, эгер исключение пайда болсо же жооп ката абалына ээ болсо, сервлет контейнери контейнер ичинде көрүнүштү жөнөтүүнү ERROR аталышына жүктөйт (мисалы, /error
). Анын бардыгы DispatcherServlet
менен иштелип чыгат, анотациясы @Controller
болушу мүмкүн болгон, же болбосо моделдүү катаны көрсөтүүчү көрүнүш аталышын кайтаруу же жоопту JSON форматында чыгаруу үчүн реализацияланышы мүмкүн, төмөнкү мисалда көрсөтүлгөндөй:
@RestController
public class ErrorController {
@RequestMapping(path = "/error")
public Map<String, Object> handle(HttpServletRequest request) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("status", request.getAttribute("javax.servlet.error.status_code"));
map.put("reason", request.getAttribute("javax.servlet.error.message"));
return map;
}
}
@RestController
class ErrorController {
@RequestMapping(path = ["/error"])
fun handle(request: HttpServletRequest): Map<String, Any> {
val map = HashMap<String, Any>()
map["status"] = request.getAttribute("javax.servlet.error.status_code")
map["reason"] = request.getAttribute("javax.servlet.error.message")
return map
}
}
WebApplicationInitializer
менен бирге колдонсо болот, же жөн гана
web.xml
колдонсо болот.
GO TO FULL VERSION