Spring REST异常处理示例

了解如何使用Spring REST模块创建的REST API处理异常(请求验证,错误数据或其他请求处理错误)。我们将研究使用和的方法。@ControllerAdvice@ExceptionHandler

要使用全局处理REST异常@ControllerAdvice,我们需要遵循以下步骤。

1.使用@ControllerAdvice和@ExceptionHandler创建处理程序

  • @ControllerAdvice注解是注解的一种特殊形式@Component,它的方法(带有标记 @ExceptionHandler)在@Controller全球多个类之间共享。
  • 带类@ControllerAdvice是自动检测通过类路径扫描。
  • 使用选择器annotations()basePackageClasses()basePackages()来定义目标控制器的更狭窄子集。
  • 我们可以在选择器中应用OR Operator ,即,如果遇到给定异常中的任何一个,则将执行给定方法。

请注意,ResponseEntityExceptionHandler@ControllerAdvice希望通过方法在所有方法之间提供集中式异常处理的类的便捷基类。@RequestMapping@ExceptionHandler

import java.util.ArrayList;
import java.util.List;

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.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler 
{
	private String INCORRECT_REQUEST = "INCORRECT_REQUEST";
	private String BAD_REQUEST = "BAD_REQUEST";
	
	@ExceptionHandler(RecordNotFoundException.class)
	public final ResponseEntity<ErrorResponse> handleUserNotFoundException
						(RecordNotFoundException ex, WebRequest request) 
	{
		List<String> details = new ArrayList<>();
		details.add(ex.getLocalizedMessage());
		ErrorResponse error = new ErrorResponse(INCORRECT_REQUEST, details);
		return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
	}
	
	@ExceptionHandler(MissingHeaderInfoException.class)
	public final ResponseEntity<ErrorResponse> handleInvalidTraceIdException
						(MissingHeaderInfoException ex, WebRequest request) {
		List<String> details = new ArrayList<>();
		details.add(ex.getLocalizedMessage());
		ErrorResponse error = new ErrorResponse(BAD_REQUEST, details);
		return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
	}
}

2.创建异常模型类

我们需要识别业务异常用例,并用异常类来表示它们。这些类将扩展RuntimeException类。也可以根据需要随意创建更多错误响应表示。

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(HttpStatus.BAD_REQUEST)
public class MissingHeaderInfoException extends RuntimeException
{
	private static final long serialVersionUID = 1L;

	public MissingHeaderInfoException(String message) {
        super(message);
    }
}
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(HttpStatus.NOT_FOUND)
public class RecordNotFoundException extends RuntimeException
{
	private static final long serialVersionUID = 1L;

	public RecordNotFoundException(String message) {
        super(message);
    }
}
import java.util.List;

public class ErrorResponse
{
    public ErrorResponse(String message, List<String> details) {
        super();
        this.message = message;
        this.details = details;
    }
 
    private String message;
    private List<String> details;

	//getters and setters
}

3.配置视图解析器

如果尚未完成,我们需要配置视图解析器以将异常消息转换为XML或JSON形式。

在Spring Boot中,此配置是自动完成的。没有Spring Boot ,我们需要像下面这样。

重要说明:确保我们已启用mvc:annotation驱动的配置或使用了@EnableWebMvc注解。

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context.xsd
	http://www.springframework.org/schema/data/jpa 
    http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
	http://www.springframework.org/schema/mvc
	http://www.springframework.org/schema/mvc/spring-mvc.xsd">

	<mvc:annotation-driven />

	<context:component-scan base-package="com.how2codex.demo" />
	
	<mvc:view-resolvers>
        <mvc:content-negotiation>
            <mvc:default-views>
                <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
            </mvc:default-views>
        </mvc:content-negotiation>
    </mvc:view-resolvers>
	
	<!-- JPA Config -->
</beans>

4。 REST控制器更改

从rest控制器处理程序方法中,我们需要抛出要转换并作为响应发送给API使用者的异常。在这种情况下,我们将发送邮件RecordNotFoundException以防员工被搜索到id并且该员工不在数据库中。

@GetMapping("/employees/{id}")
Employee getEmployeeById(@PathVariable Long id) 
{
	return repository.findById(id)
			.orElseThrow(() -> new RecordNotFoundException("Employee id '" + id + "' does no exist"));
}

5。 Spring REST异常处理演示

尝试按ID(在数据库中不存在ID)获取员工。

HTTP GET : http://localhost:8080/SpringRestExample/api/rest/employee-management/employees/101
{
	"message": "INCORRECT_REQUEST",
	"details": [
	  	"Employee id '101' does no exist"
	],
}

让我在Spring Rest API中处理有关异常处理的问题。

saigon has written 1445 articles

Leave a Reply