基于javax.validation结合spring的最佳实践

基于javax.validation结合Spring的最佳实践,主要是利用Spring框架提供的ValidatorDataBinder接口以及javax.validation提供的注解和API对请求参数和数据模型进行合法性校验,来保证应用程序的数据输入和输出的正确性。

下面是基于Spring Boot的完整攻略:

1. 引入依赖

pom.xml文件中引入以下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
</dependencies>

注:spring-boot-starter-validation依赖会自动引入hibernate-validatorjavax.el依赖。

2. 创建校验器

创建一个MyValidator类,继承javax.validation.ConstraintValidator接口:

public class MyValidator implements ConstraintValidator<MyConstraint, Object> {

    @Override
    public void initialize(MyConstraint constraintAnnotation) {
        // 初始化
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        // 校验逻辑
    }
}

其中MyConstraint是自定义注解,定义如下:

@Documented
@Constraint(validatedBy = MyValidator.class)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyConstraint {

    String message() default "自定义校验错误";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

3. 在数据模型上添加校验注解

在数据模型上添加javax.validation.constraints包下的注解,比如:

public class User {

    @NotNull(message = "用户名不能为空")
    @Size(min = 5, max = 10, message = "用户名长度必须在5到10之间")
    private String username;

    @Email(message = "邮箱格式不正确")
    private String email;

    @MyConstraint
    private Object obj;

    // getter和setter方法
}

其中,@NotNull注解表示不能为空,@Size注解表示长度限制,@Email注解表示邮箱格式,@MyConstraint表示自定义注解。

4. 在控制器中进行校验

在控制器中使用@Valid注解对请求参数进行校验,比如:

@RestController
public class UserController {

    @PostMapping("/users")
    public String addUser(@Valid User user) {
        // 如果校验失败,会抛出MethodArgumentNotValidException异常
        // 处理异常的方式可以在全局使用@ControllerAdvice注解进行统一处理
        return "success";
    }
}

5. 自定义错误消息

可以在ValidationMessages.properties文件中自定义错误消息,例如:

javax.validation.constraints.NotNull.message=用户名不能为空
javax.validation.constraints.Size.message=用户名长度必须在{0}到{1}之间
javax.validation.constraints.Email.message=邮箱格式不正确
com.example.demo.validation.constraints.MyConstraint.message=自定义校验错误

其中,{0}{1}表示占位符,将在实际校验时被替换成注解中的参数。

示例一:校验请求参数

下面是一个校验请求参数的例子:

控制器:

@RestController
public class UserController {

    @GetMapping("/users")
    public String getUser(@RequestParam("id") @NotNull(message = "用户ID不能为空") Long id) {
        return "success";
    }
}

请求:

GET /users?id=

响应:

{
    "timestamp": "2021-11-24T05:24:50.647+00:00",
    "status": 400,
    "error": "Bad Request",
    "message": "参数错误",
    "path": "/users"
}

示例二:校验数据模型

下面是一个校验数据模型的例子:

控制器:

@RestController
public class UserController {

    @PostMapping("/users")
    public String addUser(@Valid User user) {
        return "success";
    }
}

数据模型:

public class User {

    @NotNull(message = "用户名不能为空")
    @Size(min = 5, max = 10, message = "用户名长度必须在5到10之间")
    private String username;

    @Email(message = "邮箱格式不正确")
    private String email;

    // getter和setter方法
}

请求:

POST /users
{
    "username": "test",
    "email": "test"
}

响应:

{
    "timestamp": "2021-11-24T05:34:32.690+00:00",
    "status": 400,
    "error": "Bad Request",
    "message": "参数错误",
    "path": "/users"
}

注:建议在控制器中使用javax.validation.ConstraintViolationException类捕获校验失败的异常,并将异常信息返回到响应体中。可以自定义一个异常处理类,实现ResponseEntityExceptionHandler接口,在其中重写handleMethodArgumentNotValid方法,返回包含统一格式的响应体。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于javax.validation结合spring的最佳实践 - Python技术站

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

相关文章

  • 详解Java的面向对象和面向过程

    详解Java的面向对象和面向过程 Java是一门面向对象的编程语言,这意味着它支持对象化编程,而面向过程编程则是一种以过程为中心的编程方式。本文将从概念、特征、优缺点、适用场景和示例等方面详细讲解Java的面向对象和面向过程的区别与联系。 面向对象编程 概念 面向对象编程是一种以对象为中心的编程范式,强调“对象”的概念和特征,如:封装、继承、多态等。通过使用…

    Java 2023年5月23日
    00
  • java时间戳与日期相互转换工具详解

    Java时间戳与日期相互转换工具详解 在Java中,时间戳(timestamp)是指自1970年1月1日00:00:00以来所经过的毫秒数。而日期(date)则是表示具体年月日的数据类型。在开发中,我们常常需要进行时间戳和日期之间的转换。下面是详细的转换方法。 时间戳转日期 Java中可以通过java.util.Date类将时间戳转换为日期类型,具体代码如下…

    Java 2023年5月20日
    00
  • SpringMVC开发restful API之用户查询代码详解

    下面我将详细讲解“SpringMVC开发restful API之用户查询代码详解”的完整攻略: 简介 本攻略旨在讲解如何使用SpringMVC框架开发restful API进行用户查询操作。通过本攻略,读者将能够掌握SpringMVC框架开发restful API的基本流程,并了解如何进行用户查询操作。本攻略适合Java开发者学习使用。 准备工作 在开始本攻…

    Java 2023年5月26日
    00
  • c# 实现雪花分形的示例

    C# 实现雪花分形的示例攻略 什么是雪花分形 雪花分形指的是由Koch曲线组成的图形。Koch曲线是一条无限长的分形曲线,由等边三角形递归地扩展而来。 实现步骤 第一步:绘制基础图形 首先,我们需要绘制一个等边三角形,作为雪花分形的基础图形。 Graphics g = this.CreateGraphics(); Pen pen = new Pen(Colo…

    Java 2023年5月26日
    00
  • Java操作redis设置第二天凌晨过期的解决方案

    下面就是Java操作redis设置第二天凌晨过期的解决方案的完整攻略。 准备工作 首先需要引入redis的Java客户端库,如Jedis,Lettuce等,具体可参考官方文档进行引入。 方案一:设置过期时间为当天凌晨 我们可以通过计算当前时间距离当天凌晨的秒数,将该秒数加上一天86400秒作为过期时间,在Redis中进行设置。 示例代码如下: // Jedi…

    Java 2023年5月20日
    00
  • struts2+spring+hibernate分页代码[比较多]第1/7页

    下面我来为你详细讲解“struts2+spring+hibernate分页代码[比较多]第1/7页”的完整攻略。 概述 该攻略主要涉及到使用struts2、spring、hibernate等框架进行分页的操作。在该攻略中,我们将使用分页插件完成分页操作,具体实现过程如下。 步骤 引入分页插件 我们可以通过Maven引入pagehelper插件,具体配置如下:…

    Java 2023年5月20日
    00
  • SpringBoot自定义注解开发指南

    SpringBoot自定义注解开发指南 Spring Boot是一个非常流行的Java框架,它可以帮助开发人员快速构建基于Spring的应用程序。在本文中,我们将详细讲解如何使用Spring Boot开发自定义注解,并提供两个示例。 自定义注解 自定义注解是一种Java语言的扩展机制,它允许开发人员在代码中添加元数据信息。在Spring Boot中,我们可以…

    Java 2023年5月15日
    00
  • 什么是Java布隆过滤器?如何使用你知道吗

    Java布隆过滤器是一种通过牺牲一定的精度来提高查询效率的数据结构。它起初被应用于分布式缓存系统 Redis 中,但是随着应用场景的不断拓宽,布隆过滤器也被广泛应用于搜索引擎、Web爬虫、词法分析等领域。本文将详细讲解如何使用Java实现一个基础版的布隆过滤器。 布隆过滤器的原理 布隆过滤器可以看作是由一组哈希函数和一个二进制的比特向量构成的。具体来说,我们…

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