个性化阅读
专注于IT技术分析

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

如前所述, 我们应该定义所有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
@RestController
public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler
{
@ExceptionHandler(Exception.class)
//override method of ResponseEntityExceptionHandler class
public final ResponseEntity<Object> 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.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
@RestController
public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler
{
@ExceptionHandler(Exception.class)
//override method of ResponseEntityExceptionHandler class
public final ResponseEntity<Object> 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<Object> 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, 带有定义的异常结构。

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

赞(0)
未经允许不得转载:srcmini » 为所有资源实现通用异常处理

评论 抢沙发

评论前必须登录!