当前位置: 代码网 > it编程>编程语言>Java > SpringBoot使用@Valid或者@Validated时自定义校验的场景分析

SpringBoot使用@Valid或者@Validated时自定义校验的场景分析

2025年12月31日 Java 我要评论
一、自定义校验场景平常开发项目想要校验参数是否合法一般会在类的字段上添加一些校验注解比如@notempty、@size、@pattern等等,但这种是针对单个字段的校验,当我们有一些比较灵活的场景,比

一、自定义校验场景

平常开发项目想要校验参数是否合法一般会在类的字段上添加一些校验注解比如@notempty、@size、@pattern等等,但这种是针对单个字段的校验,当我们有一些比较灵活的场景,比如根据多个字段进行判断应该如何做呢。

二、添加自定义注解

场景:假设我们有一个注册接口,有两个字段分别是注册类型(手机注册、邮箱注册)、联系方式,当用户以手机号注册时我们需要校验手机号是否合法,当用户以邮箱注册时我们需要校验邮箱是否合法。

自定义注解

package com.promote.demo.util;
import javax.validation.constraint;
import javax.validation.payload;
import java.lang.annotation.documented;
import java.lang.annotation.retention;
import java.lang.annotation.target;
import static java.lang.annotation.elementtype.*;
import static java.lang.annotation.retentionpolicy.runtime;
@target({method, field, annotation_type, constructor, parameter, type_use})
@retention(runtime)
@documented
@constraint(validatedby = {customvalidator.class})
public @interface custom {
    string message() default "";
    class<?>[] groups() default {};
    class<? extends payload>[] payload() default {};
}

自定义注解的约束实现类

package com.promote.demo.util;
import cn.hutool.core.lang.patternpool;
import com.promote.demo.model.registermodel;
import org.apache.commons.lang3.stringutils;
import javax.validation.constraintvalidator;
import javax.validation.constraintvalidatorcontext;
public class customvalidator implements constraintvalidator<custom, registermodel> {
    @override
    public boolean isvalid(registermodel value, constraintvalidatorcontext context) {
        context.disabledefaultconstraintviolation();
        string type = value.gettype();
        int constraints = 0;
        if (stringutils.isnotblank(value.getcontact())) {
            //是否手机号注册
            if ("1".equals(type) && !patternpool.mobile.matcher(value.getcontact()).matches()) {
                context.buildconstraintviolationwithtemplate("手机号格式不正确").addconstraintviolation();
                constraints++;
            }
            //是否邮件注册
            if ("2".equals(type) && !patternpool.email.matcher(value.getcontact()).matches()) {
                context.buildconstraintviolationwithtemplate("邮箱格式不正确").addconstraintviolation();
                constraints++;
            }
        }
        return constraints <= 0;
    }
}

注册接口的dto类

package com.promote.demo.model;
import com.promote.demo.util.custom;
import io.swagger.annotations.apimodelproperty;
import lombok.data;
import javax.validation.constraints.notblank;
import java.io.serializable;
@data
@custom
public class registermodel implements serializable {
    @apimodelproperty("注册类型")
    @notblank(message = "注册类型不能为空")
    private string type;
    @apimodelproperty("联系方式")
    @notblank(message = "联系方式不能为空")
    private string contact;
}

全局异常

package com.promote.demo.controller;
import com.promote.demo.model.baseresponse;
import org.springframework.http.httpstatus;
import org.springframework.validation.bindexception;
import org.springframework.validation.objecterror;
import org.springframework.web.bind.annotation.controlleradvice;
import org.springframework.web.bind.annotation.exceptionhandler;
import org.springframework.web.bind.annotation.responsebody;
import java.util.list;
import java.util.stream.collectors;
@controlleradvice
public class globalexceptionhandler {
    /**
     * 拦截参数不合法异常,自定义输出结果
     */
    @exceptionhandler(bindexception.class)
    @responsebody
    public baseresponse<string> bindexception (exception ex) {
        bindexception bindexception = (bindexception) ex;
        list<objecterror> errors = bindexception.getallerrors();
        string msg = errors.stream().map(objecterror::getdefaultmessage).collect(collectors.joining(","));
        baseresponse<string> baseresponse = new baseresponse<>();
        baseresponse.setmsg(msg);
        baseresponse.setcode(httpstatus.bad_request.value());
        baseresponse.setsuccess(false);
        return baseresponse;
    }
}

三、运行效果

到此这篇关于springboot使用@valid或者@validated时自定义校验场景分析的文章就介绍到这了,更多相关springboot @valid @validated自定义校验内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com