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

yizhihongxing

基于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日

相关文章

  • Spring MVC中使用Controller如何进行重定向

    在 Spring MVC 中,我们可以使用 Controller 进行重定向。重定向是指将用户请求重定向到另一个 URL,通常用于处理表单提交后的页面跳转。本文将详细讲解 Spring MVC 中使用 Controller 进行重定向的完整攻略,包括如何使用 RedirectAttributes 和 ModelAndView 两种方式进行重定向,并提供两个示…

    Java 2023年5月18日
    00
  • 为何Java单例模式我只推荐两种

    Java单例模式是一种设计模式,它确保一个类在任何时间内只有一个实例,并提供一种全局访问该实例的方式。单例模式在许多场景中都很有用,例如线程池、数据库连接池、日志工具等。 在Java的单例模式实现中,有很多方法,但是只有少数几种方法被广泛认为是最有效、最稳定、最可靠的。本文将介绍这些最流行的两种Java单例模式实现,同时详细讲解它们的优点和缺点。 饿汉式单例…

    Java 2023年5月26日
    00
  • java自定义动态链接数据库示例

    针对”java自定义动态链接数据库示例”,我将为你提供完整的攻略。 什么是动态链接数据库? 动态链接数据库 (Dynamic Link Library,简称 DLL) 是一种 Windows 平台下的动态链接库,它可以被程序连接、调用,用来提供特定的功能服务。与静态链接库不同,动态链接库在程序运行时才被载入,占用更少的内存空间,节省系统资源。 Java如何链…

    Java 2023年5月19日
    00
  • 解析java中的error该不该捕获

    解析Java中的Error是否应该捕获,需要考虑到Error类是Throwable类的子类,它们都是Throwable的两个直接子类,都表示了Java程序中的异常状况。与Exception不同的是,Error类表示的是JVM在运行时所遇到的严重问题,比如说OutOfMemoryError、NoClassDefFoundError等。由于Error类的严重性质…

    Java 2023年5月27日
    00
  • Hibernate实体对象继承的三种方法

    Hibernate是一款流行的Java ORM框架,它提供了多种映射关系的继承方式,这里我们主要介绍三种实现方式。 单表继承 单表继承,即将继承关系建立在同一张表中,使用一个“discriminator”字段用于区分不同的实体子类。这种继承方式实现简单,对于表中数据量不大的情况适用。 实现方式 使用@Entity注解声明父类,使用@Discriminator…

    Java 2023年5月20日
    00
  • SpringBoot响应处理实现流程详解

    下面我将详细讲解“SpringBoot响应处理实现流程详解”的完整攻略。 前言 Spring Boot 响应处理的实现流程是相对复杂的,但是熟练掌握后对于实现自己的响应处理或者了解框架背后的原理非常有帮助。 Spring Boot响应处理实现流程详解 Spring Boot 的请求响应处理流程大概如下: 用户请求到达 DispatcherServlet 后,…

    Java 2023年5月15日
    00
  • 使用smartupload组件实现jsp+jdbc上传下载文件实例解析

    使用smartupload组件实现JSP+JDBC上传下载文件,需要经过以下步骤: 下载SmartUpload组件 从官方网站 http://smartupload.io/ 下载最新版本的SmartUpload组件(smartupload.jar),并将其添加到项目的classpath中。 配置Web.xml 在Web.xml中配置SmartUpload的处…

    Java 2023年6月15日
    00
  • 详解Java中雪花算法的实现

    详解Java中雪花算法的实现 需求概述 在分布式系统中,为了保证业务数据的唯一性,需要生成唯一的ID。传统的ID生成方式可能出现因为高并发而重复的情况,而雪花算法(Snowflake)正是为了解决这个问题而出现的。 本文会详细介绍Java中雪花算法的实现,及其原理。 雪花算法的基本原理 雪花算法是Twitter开源的分布式ID生成算法,采用一个64位的lon…

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