如前所述, 我们应该定义所有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, 带有定义的异常结构。
文章图片
推荐阅读
- 使用Spring Boot初始化RESTful Web服务项目
- 使用自定义注释增强Swagger文档
- 为RESTful服务实现动态过滤
- 内容协商实现对XML的支持
- 实现DELETE方法删除用户资源
- 执行POST服务为用户创建帖子
- RESTful Web服务最佳实践
- JAX-RS教程介绍
- 回收站删除了怎样恢复,本文教您回收站删除了文件怎样恢复