一个简单的自定义规则校验注释,校验图片名是不是.jpg或者.png

校验规则的类

package com.wzw.pdfconverword.validator;

import com.wzw.pdfconverword.annotation.Img;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
//Img注解没创建的时候会报错
public class ImgValidator implements ConstraintValidator<Img, String> {

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {

        //s使用了注解的对象的参数值,这里判断它是不是.jpg或者.png的图片
        if (s.contains(".jpg") || s.contains(".png")) {
            return true;
        }
        return false;
    }
}

自定义校验的注解

package com.wzw.pdfconverword.annotation;

import com.wzw.pdfconverword.validator.ImgValidator;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;

import java.lang.annotation.*;

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})	//注解使用范围
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = ImgValidator.class)	//指定校验规则的类
public @interface Img {
    String message() default "{img.invalid}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

测试

使用就和校验的注解一样,修饰方法参数或者对象属性。 测试

@GetMapping("/get")
    public String get(@Img(message = "图片格式不对") String arg){
        System.out.println("------------:"+arg);
        return arg;
    }

springboot自定义校验注解_spring

使用全局异常处理,直接返回校验结果

  • 全局异常处理代码
package com.wzw.pdfconverword.handler;

import com.wzw.pdfconverword.entity.Result;
import jakarta.validation.ValidationException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class MyExceptionHandler {


    @ExceptionHandler(ValidationException.class)
    public Result<?> validationException(ValidationException e) {
        return Result.fail(e.getMessage());
    }

}
  • 返回结果封装对象
package com.wzw.pdfconverword.entity;

import com.wzw.pdfconverword.ResultCodeEnum;
import lombok.Data;

@Data // Lombok 插件注解。
public class Result<T> {

    // 状态码。
    private Integer code;

    // 信息。
    private String message;

    // 数据。
    private T data;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public Result() {
    }

    public static <T> Result<T> build(Integer code, String message, T resultData) {

        Result<T> result = new Result<>();

        if (resultData != null){
            result.setData(resultData);
        }

        result.setCode(code);
        result.setMessage(message);

        return result;
    }

    public static Result success(){
        Result result = new Result();
        result.setCode(ResultCodeEnum.SUCCESS.getResultCode());
        result.setMessage(ResultCodeEnum.SUCCESS.getResultMsg());
        return result;
    }

    public static<T> Result<T> success(T resultData){
        Result<T> result = build(ResultCodeEnum.SUCCESS.getResultCode(), ResultCodeEnum.SUCCESS.getResultMsg(), resultData);
        return result;
    }

    public static Result fail(){
        Result result = new Result();
        result.setCode(ResultCodeEnum.FAIL.getResultCode());
        result.setMessage(ResultCodeEnum.FAIL.getResultMsg());
        return result;
    }

    //失败的方法
    public static<T> Result<T> fail(T resultData) {
        return build(ResultCodeEnum.FAIL.getResultCode(), ResultCodeEnum.FAIL.getResultMsg(), resultData);
    }
}

测试返回异常信息

返回成功

springboot自定义校验注解_spring_02