javax.validation 效验工具(validation-api组件)使用教程

本文介绍了一种在后端开发中高效处理校验任务的方法,利用javax.validation.validation-api和hibernate-validator组件,通过示例展示了如何在Spring环境中配置和使用校验功能,包括实体类的注解使用和校验工具类的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在后端开发时,不可避免的需要处理一些校验, 如果是写if-else这种代码去校验, 那会有一大段这样的代码。不过还好有个校验插件:javax.validation.validation-api,不过一般会引用hibernate的校验组件:org.hibernate.hibernate-validator, 它已经引用了validation-api组件。

首先pom.xml引入依赖

   <!-- validator -->
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.4.Final</version>
        </dependency>

Spring配置注入bean

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

自己的Violation实体

这里使用的Lombok获取get和set,使用的@Getter注解 @Setter注解

import java.util.List;

/**
 * @Auther: Summer
 * @Date: 2019-01-05 11:35
 * @Description:  测试实体类
 * @versions:1.0
 */
@Getter
@Setter
public class TestVo {
    @NotBlank   // @NotBlank 必须是String类型的
    private  String  msg;
    @NonNull  // @NotNull:不能为null,但可以为empty,没有Size的约束
    private String id;

    private List<String> str;
}

接口工具类util

/**
 * @Auther: Summer
 * @Date: 2019-01-05 11:00
 * @Description: 接口效验
 * @versions:1.0
 */
public class BeanValidator {
    private static ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();

    public static <T> Map<String, String> validate(T t, Class... groups) {
        Validator validator = validatorFactory.getValidator();
        Set validateResult = validator.validate(t, groups);
        if (validateResult.isEmpty()) {   //如果校验有值
            return Collections.emptyMap();
        } else {
            LinkedHashMap errors = Maps.newLinkedHashMap();
            Iterator iterator = validateResult.iterator();
            while (iterator.hasNext()) {
                ConstraintViolation violation = (ConstraintViolation)iterator.next();
                errors.put(violation.getPropertyPath().toString(), violation.getMessage());
            }
            return errors;
        }
    }

    public static Map<String, String> validateList(Collection<?> collection) {
        Preconditions.checkNotNull(collection); //判断是否为空
        Iterator iterator = collection.iterator();
        Map errors;

        do {
            if (!iterator.hasNext()) {
                return Collections.emptyMap();
            }
            Object object = iterator.next();
            errors = validate(object, new Class[0]);
        } while (errors.isEmpty());

        return errors;
    }

    public static Map<String, String> validateObject(Object first, Object... objects) {
        if (objects != null && objects.length > 0) {
            return validateList(Lists.asList(first, objects));
        } else {
            return validate(first, new Class[0]);
        }
    }

通过controller 验证Slf4j的log.info打印日志信息验证是否成功

package com.mmall.controller;
import com.mmall.common.JsonDate;
import com.mmall.param.TestVo;
import com.mmall.util.BeanValidator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.Map;
@Controller
@RequestMapping("/test")
@Slf4j
public class TestController {
    @RequestMapping("/validate.json")
    @ResponseBody
    public JsonDate validate(TestVo vo){
         log.info("validate");
         try {
             Map<String,String> map = BeanValidator.validateObject(vo);
             if(map != null && map.entrySet().size() >0){
                 for (Map.Entry<String,String> entry: map.entrySet()){
                     log.info("{}->{}",entry.getKey(),entry.getValue());
                 }
             }
         }catch (Exception e){

         }
        return JsonDate.success("test,validate");
    }
}

打印结果:

附注解图:

Java 8提供了很多方便的工具来进行参数校验,其中最常用的是javax.validation包下的注解。 下面是一个简单的入参验证示例,包括字段类型、长度、手机号码格式、邮箱格式、空值和必传参数等方面的验证。 ```java import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; public class User { @NotNull(message = "用户名不能为空") @Size(min = 1, max = 20, message = "用户名长度必须在1到20之间") private String username; @NotNull(message = "密码不能为空") @Size(min = 6, max = 20, message = "密码长度必须在6到20之间") private String password; @Pattern(regexp = "^1[3456789]\\d{9}$", message = "手机号码格式不正确") private String phone; @Email(message = "邮箱格式不正确") private String email; public User(String username, String password, String phone, String email) { this.username = username; this.password = password; this.phone = phone; this.email = email; } // getter and setter methods } ``` 在上面的示例中,我们使用javax.validation.constraints包中的一些注解对User类中的字段进行验证。 @NotNull注解表示该字段必须不为null; @Size注解表示该字段的长度必须在指定的范围内; @Pattern注解表示该字段必须符合指定的正则表达式; @Email注解表示该字段必须是一个有效的邮箱地址。 通过这些注解,我们可以方便地实现参数校验。当参数不符合要求时,会抛出ConstraintViolationException异常,我们可以在异常处理中返回相应的错误信息给客户端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值