📜  为所有资源实现通用异常处理

📅  最后修改于: 2021-01-12 00:48:12             🧑  作者: Mango

为所有资源实现通用异常处理

如前所述,我们应该定义所有RESTful服务都遵循的标准异常结构。在本节中,我们将讨论所有资源的通用异常处理的实现。

让我们看看如何自定义异常消息。

步骤1:创建一个名为com.javatpoint.server.main.exception的新包。

步骤2:在上述包中,创建一个名称为ExceptionResponse的类。

步骤3:在基本级别上,异常结构有三项关键要素:时间戳,消息详细信息。定义这三个字段。

步骤4:使用字段生成构造函数。

步骤5:生成Getter,不需要Setter。

定义结构后,我们可以为其定义Java实现。每当发生异常时,我们都将以特定格式返回响应。结构是最重要的部分,必须与语言无关。

Spring Framework中重要的类之一是ResponseEntityExceptionHandler类。它是异常的抽象基类,可在所有不同的异常处理程序方法之间提供集中式异常处理。我们将扩展此类以处理并提供定制的异常处理功能。此异常处理功能作为HellowWorldController,UserResource(控制器)应用于所有控制器。

步骤6:在com.javatpoint.server.main.exception包中创建一个名为CustomizedResponseEntityExceptionHandler的新类,并扩展ResponseEntityExceptionHandler类。

步骤7:添加@ControllerAdvice和@RestController批注。

步骤8:在包资源管理器中展开Maven依赖关系->展开spring-webmvc-5.1.9.RELEASE.jar->展开org.springframework.web.servlet.mvc.method.annotation->打开ResponseEntityExceptionHandler.class

步骤9:从ResponseEntityExceptionHandler.class复制ResponseEntityMethod 方法,然后粘贴到CustomizedResponseEntityExceptionHandler.java文件中。

步骤10:重写ResponseEntityMethod方法。将方法名称重命名为handleAllExceptions()。

步骤11:创建异常响应结构。

步骤12:创建一个ResponseEntity对象,并将异常响应和Http状态作为参数传递。

CustomizedResponseEntityExceptionHandler.java

package com.javatpoint.server.main;
import java.util.Date;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import com.javatpoint.server.main.exception.ExceptionResponse;
//defining exception handling for all the exceptions
@ControllerAdvice
@RestController
public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler
{
@ExceptionHandler(Exception.class)
//override method of ResponseEntityExceptionHandler class
public final ResponseEntity handleAllExceptions(Exception ex, WebRequest request)
{
//creating exception response structure
ExceptionResponse exceptionResponse= new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false));
//returning exception structure and specific status 
return new ResponseEntity(exceptionResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
}


步骤13:打开rest客户Postman并发送Get请求。我们得到状态:500内部服务器错误和我们定义的异常结构。

如果我们要将“内部服务器错误”状态自定义为,则需要在CustomizedResponseEntityExceptionHandler.java文件中进行一些更改。

CustomizedResponseEntityExceptionHandler.java

package com.javatpoint.server.main;
import java.util.Date;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import com.javatpoint.server.main.exception.ExceptionResponse;
import com.javatpoint.server.main.user.UserNotFoundException;
//defining exception handling for all the exceptions 
@ControllerAdvice
@RestController
public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler
{
@ExceptionHandler(Exception.class)
//override method of ResponseEntityExceptionHandler class
public final ResponseEntity handleAllExceptions(Exception ex, WebRequest request)
{
//creating exception response structure
ExceptionResponse exceptionResponse= new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false));
//returning exception structure and Internal Server status 
return new ResponseEntity(exceptionResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
@ExceptionHandler(UserNotFoundException.class)
//override method of ResponseEntityExceptionHandler class
public final ResponseEntity handleUserNotFoundExceptions(UserNotFoundException ex, WebRequest request)
{
//creating exception response structure
ExceptionResponse exceptionResponse= new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false));
//returning exception structure and Not Found status 
return new ResponseEntity(exceptionResponse, HttpStatus.NOT_FOUND);
}    
}


再次移至Postman并发送Get请求。我们得到状态:404 Not Found,带有定义的异常结构。