Java Controller实现参数验证与统一异常处理流程详细讲解

Java Controller实现参数验证与统一异常处理流程详细讲解

参数验证

当我们在编写Java Web应用的Controller时,经常需要验证请求参数的合法性,例如是否为空、是否符合指定格式、是否在合理范围内等。Spring框架提供了一种方便的方式来进行参数验证,即使用JSR-303标准提供的注解来标识验证规则。我们可以使用javax.validation.constraints包下的注解来进行验证,例如:

@RequestMapping("/user")
public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
    // ...
}

在这个示例中,@Valid注解表示需要对User对象进行参数验证。Spring会自动根据@Valid注解查找User类中使用了JSR-303注解的字段,并根据注解规则进行验证。例如,如果我们在User类中添加了@NotNull注解,表示该字段不能为null,那么当请求中的JSON数据缺少该字段或者该字段值为null时,Spring就会自动抛出MethodArgumentNotValidException异常,我们可以在Controller中进行处理,例如:

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ErrorResponse> handleValidationException(MethodArgumentNotValidException e) {
    BindingResult bindingResult = e.getBindingResult();
    List<String> errors = new ArrayList<>();
    for (FieldError error : bindingResult.getFieldErrors()) {
        errors.add(String.format("%s:%s", error.getField(), error.getDefaultMessage()));
    }
    ErrorResponse response = new ErrorResponse(HttpStatus.BAD_REQUEST.value(), "请求参数不合法", errors);
    return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
}

在这个示例中,我们使用了@ExceptionHandler注解来处理MethodArgumentNotValidException异常,该异常是Spring在参数验证过程中发现参数不合法时自动抛出的异常。在异常处理方法中,我们使用BindingResult对象获取验证结果,并将结果转换为我们自定义的ErrorResponse对象。

统一异常处理

在编写Java Web应用的Controller时,我们经常需要对出现异常的情况进行处理,例如防护未检查异常、统一返回异常信息等。Spring提供了多种方式来进行异常处理,其中一种常用方式是使用@ExceptionHandler注解来标识异常处理方法,并使用ResponseEntity对象返回异常信息,例如:

@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFoundException(UserNotFoundException e) {
    ErrorResponse response = new ErrorResponse(HttpStatus.NOT_FOUND.value(), "找不到用户", null);
    return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response);
}

在这个示例中,我们使用@ExceptionHandler注解来标识对UserNotFoundException异常的处理方法。在处理方法中,我们创建一个ErrorResponse对象,并使用ResponseEntity对象将其返回。在实际使用中,我们可以根据异常的不同类型,采取不同的处理方式,例如使用不同的HTTP状态码、返回不同的异常信息等。

示例说明

下面是一个完整的Controller示例,用于演示参数验证和统一异常处理的实现方式:

@RestController
public class UserController {

    @PostMapping("/user")
    public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
        // ...
    }

    @GetMapping("/user/{id}")
    public ResponseEntity<User> getUser(@PathVariable long id) {
        User user = userService.findUserById(id);
        if (user == null) {
            throw new UserNotFoundException();
        }
        return ResponseEntity.ok(user);
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(MethodArgumentNotValidException e) {
        BindingResult bindingResult = e.getBindingResult();
        List<String> errors = new ArrayList<>();
        for (FieldError error : bindingResult.getFieldErrors()) {
            errors.add(String.format("%s:%s", error.getField(), error.getDefaultMessage()));
        }
        ErrorResponse response = new ErrorResponse(HttpStatus.BAD_REQUEST.value(), "请求参数不合法", errors);
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
    }

    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<ErrorResponse> handleNotFoundException(UserNotFoundException e) {
        ErrorResponse response = new ErrorResponse(HttpStatus.NOT_FOUND.value(), "找不到用户", null);
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response);
    }
}

在这个示例中,我们使用了@Valid注解来标识参数验证的字段,在getUser方法中抛出UserNotFoundException异常,使用@ExceptionHandler注解和ErrorResponse对象对异常进行统一处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Controller实现参数验证与统一异常处理流程详细讲解 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • MyBatis数组与集合判断空问题

    标题:MyBatis数组与集合判断空问题 在MyBatis中,当我们要查询数据库中的一些数据,比如ID列表或者名称列表等,通常会用到数组或集合来进行传参,但在使用这些参数时,我们需要考虑判断它们是否为空,避免出现空指针异常。本文将介绍MyBatis中数组与集合如何进行空检查。 方法一:使用OGNL表达式 OGNL(Object-Graph Navigatio…

    Java 2023年5月26日
    00
  • 线程的作用是什么?

    以下是关于线程的作用的完整使用攻略: 线程的作用是什么? 线程是操作系统能够进行运算调度的最小单位。被包含在进程中,是进程中的实际运作单位。一个进程可以包含多个线程,每个线程可以并行执行不同的任务,从而提高效率和性。 线程的作用 线程的作用主要有以下几点: 提高程序的效率和性能:通过使用多线程可以将程序中的不同任务分配给不同的线程并行执行,从而提高程序的效率…

    Java 2023年5月12日
    00
  • Java中线程安全有哪些实现思路

    Java中线程安全是多线程编程中非常重要的概念,因为线程安全的代码能够保证多个线程同时访问同一个共享变量时不会出现竞态条件等问题。下面是Java中线程安全的实现思路: 1. 使用synchronized关键字 synchronized是Java中最基本的实现线程安全的方式,用synchronized关键字修饰方法或代码块,表示只有一个线程可以进入该代码块或方…

    Java 2023年5月18日
    00
  • 反编译jar实现的三种方式

    好的。下面我将详细讲解“反编译jar实现的三种方式”的完整攻略。 1. 反编译jar实现的三种方式 1.1 命令行反编译 命令行反编译是最常见的反编译jar的方式,也是最简单的一种方式。主要通过利用javap命令对jar包进行操作,实现对jar包里面的class和method的反编译。 首先,打开终端,进入到jar包所在的目录。 然后,输入以下命令进行反编译…

    Java 2023年5月26日
    00
  • Java学习基础之安装JDK/配置JDK环境&IEDA工具安装

    Java学习基础之安装JDK/配置JDK环境&IEDA工具安装 一、JDK安装 1. 下载JDK安装包 首先,我们需要从官方网站(https://www.oracle.com/java/technologies/javase-downloads.html)下载对应版本的JDK安装包。根据系统类型选择版本,接着选择下载即可。 2. 安装JDK 将下载好…

    Java 2023年5月24日
    00
  • JSP中动态合并单元格的实例代码

    这里提供一份“JSP中动态合并单元格的实例代码”的完整攻略,希望能够帮到您。 前言 在开发Web应用时,我们经常需要在表格中合并相邻单元格以达到更好的显示效果,而如果表格的内容来自于数据源,我们又该如何完成动态合并单元格的操作呢?下面,我将提供一些示例代码,帮助大家实现这一功能。 实现方式 实现动态合并单元格的方法有很多,这里以JSP中使用Java代码的方式…

    Java 2023年6月15日
    00
  • Android个人手机通讯录开发详解

    Android个人手机通讯录开发详解 概述 通讯录是手机操作系统中非常重要的一项功能,大多数APP,尤其是社交类APP都需要使用到该功能。本文将详细讲解如何在Android平台上开发个人手机通讯录,并提供两个示例。通讯录主要分为分组和联系人两个部分,下面将对这两部分进行详细介绍。 分组 分组主要用来对联系人进行分类,让用户能够更加方便地查找和编辑联系人信息。…

    Java 2023年5月20日
    00
  • Java中关键字synchronized的使用方法详解

    下面我将详细讲解 Java 中关键字 synchronized 的使用方法。 什么是 synchronized synchronized 是 Java 中的关键字,用来保证线程安全。 在 Java 中,当多个线程访问同一资源时,如果没有对这个资源加锁,可能会发生数据不一致的情况。而使用 synchronized 关键字可以保证在同一时刻只有一个线程可以访问一…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部