Java java지도 시간 Spring MVC 예외를 균일하게 처리하는 세 가지 방법

Spring MVC 예외를 균일하게 처리하는 세 가지 방법

Aug 29, 2019 pm 04:22 PM
spring mvc

Spring에는 통합 예외를 처리하는 세 가지 방법이 있습니다. 즉,

@ExceptionHandler 주석 사용, HandlerExceptionResolver 인터페이스 구현, @controlleradvice 주석 사용

Spring MVC 예외를 균일하게 처리하는 세 가지 방법

@ExceptionHandler 주석 사용

이 주석을 사용하면 단점이 있습니다. 중요한 점은 예외 처리 방법이 오류를 발생시킨 방법과 동일한 컨트롤러에 있어야 한다는 것입니다. 다음과 같이 사용하세요:

@Controller      
public class GlobalController {
/**    
     * 用于处理异常的    
     * @return    
     */      
@ExceptionHandler({MyException.class})
public String exception(MyException e) {
System.out.println(e.getMessage());
e.printStackTrace();
return "exception";
}
@RequestMapping("test")
public void test() {
throw new MyException("出错了!");
}
}
로그인 후 복사

보시다시피 이 방법의 가장 큰 결점은 예외를 전역적으로 제어할 수 없다는 것입니다. 각 클래스는 한 번만 작성해야 합니다.

HandlerExceptionResolver 인터페이스를 구현하세요

이 메서드를 사용하면 전역 예외 제어가 가능합니다. 예:

@Component  
public class ExceptionTest implements HandlerExceptionResolver{
/**  
     * TODO 简单描述该方法的实现功能(可选).  
     * @see org.springframework.web.servlet.HandlerExceptionResolver#resolveException(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception)  
     */  
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,  
            Exception ex) {
System.out.println("This is exception handler method!");
return null;
}
}
로그인 후 복사

@ControllerAdvice+ @ExceptionHandler 주석 사용

위에서 언급한 것처럼 @ExceptionHandler 예외 처리가 필요한 메서드는 오류를 발생시킨 메서드와 동일한 Controller에 있어야 합니다. 그런 다음 코드에 @ControllerAdvice를 추가하면 동일한 컨트롤러에 있을 필요가 없습니다. 이는 Spring 3.2에서 추가된 새로운 기능이기도 합니다. 이름에서 알 수 있듯이 일반적으로 컨트롤러 향상을 의미합니다. 즉, @controlleradvice + @ExceptionHandler도 전역 예외 포착을 달성할 수 있습니다.

이 WebExceptionHandle 클래스를 스캔하여 Spring 컨테이너에 로드할 수 있는지 확인하세요.

@ControllerAdvice
@ResponseBody
public class WebExceptionHandle {
private static Logger logger = LoggerFactory.getLogger(WebExceptionHandle.class);
/**
     * 400 - Bad Request
     */
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(HttpMessageNotReadableException.class)
public ServiceResponse handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
logger.error("参数解析失败", e);
return ServiceResponseHandle.failed("could_not_read_json");
}
/**
     * 405 - Method Not Allowed
     */
@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public ServiceResponse handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {
logger.error("不支持当前请求方法", e);
return ServiceResponseHandle.failed("request_method_not_supported");
}
/**
     * 415 - Unsupported Media Type
     */
@ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
@ExceptionHandler(HttpMediaTypeNotSupportedException.class)
public ServiceResponse handleHttpMediaTypeNotSupportedException(Exception e) {
logger.error("不支持当前媒体类型", e);
return ServiceResponseHandle.failed("content_type_not_supported");
}
/**
     * 500 - Internal Server Error
     */
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class)
public ServiceResponse handleException(Exception e) {
if (e instanceof BusinessException){
return ServiceResponseHandle.failed("BUSINESS_ERROR", e.getMessage());
}
logger.error("服务运行异常", e);
e.printStackTrace();
return ServiceResponseHandle.failed("server_error");
}
}
로그인 후 복사

처리할 예외 유형이 @ExceptionHandler 주석에 선언되지 않은 경우 매개변수 목록의 예외 유형이 기본값으로 설정됩니다. 따라서 다음과 같이 작성할 수도 있습니다:

@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler()
@ResponseBody
String handleException(Exception e){
return "Exception Deal! " + e.getMessage();
}
}
로그인 후 복사

매개변수 객체는 컨트롤러 레이어에서 발생하는 예외 객체입니다!

Rest 인터페이스에 대한 전역 예외 캡처를 구현하려면 ResponseEntityExceptionHandler 클래스를 상속하고 사용자 정의 형식을 반환할 수 있습니다.

@Slf4j
@ControllerAdvice
public class ExceptionHandlerBean  extends ResponseEntityExceptionHandler {
/**
     * 数据找不到异常
     * @param ex
     * @param request
     * @return
     * @throws IOException
     */
@ExceptionHandler({DataNotFoundException.class})
public ResponseEntity<Object> handleDataNotFoundException(RuntimeException ex, WebRequest request) throws IOException {
return getResponseEntity(ex,request,ReturnStatusCode.DataNotFoundException);
}
/**
     * 根据各种异常构建 ResponseEntity 实体. 服务于以上各种异常
     * @param ex
     * @param request
     * @param specificException
     * @return
     */
private ResponseEntity<Object> getResponseEntity(RuntimeException ex, WebRequest request, ReturnStatusCode specificException) {
ReturnTemplate returnTemplate = new ReturnTemplate();
returnTemplate.setStatusCode(specificException);
returnTemplate.setErrorMsg(ex.getMessage());
return handleExceptionInternal(ex, returnTemplate,
new HttpHeaders(), HttpStatus.OK, request);
}
}
로그인 후 복사

위 내용은 Spring MVC 예외를 균일하게 처리하는 세 가지 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Java 백엔드 개발: Java Spring MVC를 사용한 API MVC 프레임워크 개발 Java 백엔드 개발: Java Spring MVC를 사용한 API MVC 프레임워크 개발 Jun 17, 2023 am 10:27 AM

Java 백엔드 개발은 현대 인터넷 애플리케이션의 핵심이 되는 매우 중요한 기술입니다. Java 백엔드 개발에는 주로 APIMVC 프레임워크 개발이 포함됩니다. 이번 글에서는 APIMVC 프레임워크 개발을 위해 JavaSpringMVC를 사용하는 방법을 소개하겠습니다. JavaSpringMVC는 주로 웹 애플리케이션 개발에 사용되는 매우 강력한 오픈 소스 프레임워크입니다. MVC(Model-View-Controller) 아키텍처 모델을 사용합니다.

JAX-RS 대 Spring MVC: RESTful 거대 기업 간의 전투 JAX-RS 대 Spring MVC: RESTful 거대 기업 간의 전투 Feb 29, 2024 pm 05:16 PM

소개 RESTful API는 현대 웹 애플리케이션의 필수적인 부분이 되었습니다. 이는 웹 서비스 생성 및 사용에 대한 표준화된 접근 방식을 제공하여 이식성, 확장성 및 사용 용이성을 향상시킵니다. Java 생태계에서 JAX-RS와 springmvc는 RESTful API 구축을 위한 가장 널리 사용되는 두 가지 프레임워크입니다. 이 기사에서는 두 프레임워크를 자세히 살펴보고 해당 기능, 장점 및 단점을 비교하여 정보에 입각한 결정을 내리는 데 도움을 줄 것입니다. JAX-RS: JAX-RSAPI JAX-RS(RESTful 웹 서비스용 JavaAPI)는 REST 개발을 위해 JavaEE에서 개발한 표준 JAX-RSAPI입니다.

Spring MVC의 주요 개념을 익히십시오: 이러한 중요한 기능을 이해하십시오 Spring MVC의 주요 개념을 익히십시오: 이러한 중요한 기능을 이해하십시오 Dec 29, 2023 am 09:14 AM

SpringMVC의 주요 기능 이해: 이러한 중요한 개념을 익히려면 특정 코드 예제가 필요합니다. SpringMVC는 개발자가 MVC(Model-View-Controller) 아키텍처 패턴을 통해 유연하고 확장 가능한 구조를 구축하는 데 도움이 되는 Java 기반 웹 애플리케이션 개발 프레임워크입니다. 웹 애플리케이션. SpringMVC의 주요 기능을 이해하고 익히면 웹 애플리케이션을 보다 효율적으로 개발하고 관리할 수 있습니다. 이 기사에서는 SpringMVC의 몇 가지 중요한 개념을 소개합니다.

Java에서 컨트롤러 패키지의 역할 Java에서 컨트롤러 패키지의 역할 May 07, 2024 am 02:45 AM

Spring MVC 아키텍처에서 Controller 패키지는 사용자 요청을 처리하고 응답을 반환하여 비즈니스 로직을 구현합니다. 해당 책임에는 사용자 요청 수신(일반적으로 HTTP를 통해)이 포함됩니다. 요청 매개변수를 검증하고 처리합니다. 적절한 비즈니스 로직(일반적으로 서비스 계층)을 호출합니다. 뷰를 렌더링하고 사용자에게 반환합니다(일반적으로 HTML, JSON 또는 XML).

Spring Security 권한 제어 프레임워크 사용 가이드 Spring Security 권한 제어 프레임워크 사용 가이드 Feb 18, 2024 pm 05:00 PM

백엔드 관리 시스템에서는 일반적으로 다양한 사용자의 인터페이스 액세스 기능을 제한하기 위해 액세스 권한 제어가 필요합니다. 사용자에게 특정 권한이 없으면 특정 인터페이스에 액세스할 수 없습니다. 이 기사에서는 waynboot-mall 프로젝트를 예로 들어 일반적인 백엔드 관리 시스템이 권한 제어 프레임워크 SpringSecurity를 ​​도입하는 방법을 소개합니다. 개요는 다음과 같습니다. waynboot-mall 프로젝트 주소: https://github.com/wayn111/waynboot-mall 1. SpringSecurity란? SpringSecurity는 강력하고 유연한 보안을 목표로 하는 Spring 프레임워크 기반의 오픈 소스 프로젝트입니다. Java 애플리케이션용.

Spring MVC에서 핸들러 매핑은 어떻게 작동합니까? Spring MVC에서 핸들러 매핑은 어떻게 작동합니까? Apr 17, 2024 am 10:42 AM

SpringMVC의 핸들러 매핑은 요청 URI를 핸들러 메서드에 매핑합니다. 프로세스에는 요청 URI 수신, 요청 URI 구문 분석, 핸들러 메서드 및 요청-응답 정보가 포함된 HandlerExecutionChain 개체 생성이 포함됩니다. 주요 구성 요소는 매핑 레지스트리, 요청 일치자, 처리기 어댑터입니다. 실제 사례에서는 RequestMapping 주석과 핸들러 매핑을 사용하여 요청 URI "/hello"를 hello() 메서드에 매핑하는 방법을 보여줍니다.

Java 주석의 유형과 기능은 무엇입니까? Java 주석의 유형과 기능은 무엇입니까? May 04, 2024 pm 09:33 PM

Java 주석은 코드 요소에 대한 메타데이터를 제공하는 데 사용되며 메타프로그래밍, 오류 검사, 코드 생성, 문서 생성 및 반영에 사용할 수 있습니다. Spring 프레임워크는 구성을 위해 주석을 광범위하게 사용하여 애플리케이션 개발을 단순화합니다.

Go 언어와 Java: 기능과 애플리케이션 비교 Go 언어와 Java: 기능과 애플리케이션 비교 Apr 08, 2024 pm 02:45 PM

Go와 Java의 주요 차이점은 유형 시스템, 동시성 및 메모리 관리입니다. Go는 컴파일 타임에 유형을 강제로 선언하는 정적 유형 시스템을 사용하는 반면, Java는 런타임에 유형을 유추할 수 있는 반정적 유형 시스템을 사용합니다. Go의 Goroutine은 높은 동시성을 지원하는 반면 Java는 Java 스레드와 잠금 메커니즘을 사용합니다. Go는 가비지 수집기를 사용하여 메모리를 자동으로 관리하는 반면 Java는 특정 리소스에 대한 명시적인 관리를 요구합니다. 이러한 차이로 인해 다양한 애플리케이션 시나리오가 발생합니다. Go는 동시성이 높은 웹 서비스, 클라우드 컴퓨팅 및 빅데이터에 적합한 반면, Java는 복잡성과 안정성이 필요한 엔터프라이즈급 애플리케이션에 적합합니다.

See all articles