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

如前所述, 我们应该定义所有RESTful服务都遵循的标准异常结构。在本节中, 我们将讨论所有资源的通用异常处理的实现。
让我们看看如何自定义异常消息。
步骤1:创建一个名为com.srcmini.server.main.exception的新包。
步骤2:在上述包中, 创建一个名称为ExceptionResponse的类。
【为所有资源实现通用异常处理】步骤3:在基本级别上, 异常结构包含三个关键要素:时间戳, 消息和详细信息。定义这三个字段。
步骤4:使用字段生成构造函数。
步骤5:生成Getters, 不需要Setters。
定义结构后, 我们可以为其定义Java实现。每当发生异常时, 我们都将以特定格式返回响应。结构是最重要的部分, 必须与语言无关。
Spring Framework中重要的类之一是ResponseEntityExceptionHandler类。它是异常的抽象基类, 可在所有不同的异常处理程序方法之间提供集中式异常处理。我们将扩展此类, 以处理并提供定制的异常处理功能。此异常处理功能作为HellowWorldController, UserResource(控制器)应用于所有控制器。
步骤6:在com.srcmini.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 < Object> 方法, 然后粘贴到CustomizedResponseEntityExceptionHandler.java文件中。
步骤10:重写ResponseEntityMethod方法。将方法名称重命名为handleAllExceptions()。
步骤11:创建异常响应结构。
步骤12:创建一个ResponseEntity对象, 并将异常响应和Http状态作为参数传递。
CustomizedResponseEntityExceptionHandler.java
package com.srcmini.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.srcmini.server.main.exception.ExceptionResponse; //defining exception handling for all the exceptions@ControllerAdvice@RestControllerpublic class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler{@ExceptionHandler(Exception.class)//override method of ResponseEntityExceptionHandler classpublic final ResponseEntity< Object> handleAllExceptions(Exception ex, WebRequest request){//creating exception response structureExceptionResponse 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.srcmini.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.srcmini.server.main.exception.ExceptionResponse; import com.srcmini.server.main.user.UserNotFoundException; //defining exception handling for all the exceptions @ControllerAdvice@RestControllerpublic class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler{@ExceptionHandler(Exception.class)//override method of ResponseEntityExceptionHandler classpublic final ResponseEntity< Object> handleAllExceptions(Exception ex, WebRequest request){//creating exception response structureExceptionResponse 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 classpublic final ResponseEntity< Object> handleUserNotFoundExceptions(UserNotFoundException ex, WebRequest request){//creating exception response structureExceptionResponse 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, 带有定义的异常结构。
为所有资源实现通用异常处理

文章图片

    推荐阅读