SpringBoot自定义注解效验入参

1.通过ConstraintValidator验证

pom.xml

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

创建注解类,验证邮箱.

其中:

  • @Target指明这个注解要作用在什么地方,可以是对象、域、构造器等,因为要作用在age域上,因此这里选择FIELD
  • @Retention指明了注解的生命周期,可以有SOURCE(仅保存在源码中,会被编译器丢弃),CLASS(在class文件中可用,会被VM丢弃)以及RUNTIME(在运行期也被保留),这里选择了生命周期最长的RUNTIME
  • @Constraint是最关键的,它表示这个注解是一个验证注解,并且指定了一个实现验证逻辑的验证器
  • message()指明了验证失败后返回的消息,此方法为@Constraint要求
  • groups()和payload()也为@Constraint要求,可默认为空,详细用途可以查看@Constraint文档
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = EmailConstraintValidator.class)
public @interface EmailConstraint {

    String message() default "email格式错误";

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

    Class<? extends Payload>[] payload() default {};
}
public class EmailConstraintValidator implements ConstraintValidator<EmailConstraint,Object> {

    /**
     * email校验正则表达式
     */
    public static final String EMAIL_VALIDATION_REGP="^([a-zA-Z0-9_\\.\\-])+\\@(([a-zA-Z0-9\\-])+\\.)+([a-zA-Z0-9]{2,4})+$";

    @Override
    public void initialize(EmailConstraint constraintAnnotation) {

    }

    @Override
    public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
        if (!Pattern.matches(EMAIL_VALIDATION_REGP,o.toString())) {
            return false;
        }
        return true;
    }
}

创建验证对象

@Data
public class Event {
    @NotNull(message = "id不能为空")
    private Long id;
    @IntegerEnum(values = {1, 2, 3}, message = "类型错误")
    private Integer type;
    @EmailConstraint(message = "邮箱格式错误")
    private String email;
    @DataConstraint(value = "yyyy-MM-dd HH:mm:ss")
    private String createdAt;
}

 

开启注解验证

public enum ResultCode {

    SUCCESS(true,200,"success","success"),
    PARAMETER_ERROR(false,406,"参数异常",""),
    SYSTEM_ERROR(false,500,"系统异常","");


    boolean success;
    int code;
    String errName;
    String errMsg;

    ResultCode(boolean success, int code, String errName, String errMsg) {
        this.success = success;
        this.code = code;
        this.errName = errName;
        this.errMsg = errMsg;
    }
}
@Data
public class Result {
    //成功/失败
    private boolean success;
    //异常编码,正常默认为0
    private Integer errCode;
    //异常名称
    private String errName;
    //异常信息
    private String errMsg;
    //业务数据
    private Object datas;

    /**
     * 用于增,删,改操作。
     * @param code
     */
    public Result(ResultCode code){
        this.success = code.success;
        this.errCode = code.code;
        this.errName = code.errName;
        this.errMsg = code.errMsg;
    }

    /**
     * 效验入参
     * @param code
     * @param message
     */
    public Result(ResultCode code,String message){
        this.success = code.success;
        this.errCode = code.code;
        this.errName = code.errName;
        this.errMsg = message;
    }

    public Result(ResultCode resCode,Object data) {
        this.success = resCode.success;
        this.errCode = resCode.code;
        this.errName = resCode.errName;
        this.errMsg = resCode.errMsg;
        this.datas = data;
    }

    public static Result SUCCESS(){
        return new Result(ResultCode.SUCCESS);
    }

    public static Result ERROR(){
        return new Result(ResultCode.SYSTEM_ERROR);
    }

}
@RestController
public class TestController {

    @PostMapping("/test")
    public Result test(@Valid @RequestBody Event event, BindingResult validateResult) {
        if (validateResult.hasErrors()) {
            return new Result(ResultCode.PARAMETER_ERROR,validateResult.getAllErrors().get(0).getDefaultMessage());
        }
        return Result.SUCCESS();
    }
}

 

2.配置拦截器验证

配置要拦截的路径

@Configuration
public class WebAppConfigurer implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 可添加多个
        registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**");

    }


}
public class ThemeChangeInterceptor implements HandlerInterceptor {

    //在请求方法之前执行
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler){
        if(!(handler instanceof HandlerMethod)) return true;
        HandlerMethod handlerMethod = (HandlerMethod)handler;
        CustomizeComponent customizeComponent = handlerMethod.getMethod().getAnnotation(CustomizeComponent.class);
        if(customizeComponent != null){
            System.out.println("有数据");
            return true;
        }
        return false;
    }

    //在请求方法之后执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    //在DispatcherServlet处理后执行----清理工作
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot中可以自定义注解来实现特定的功能。自定义注解的步骤如下: 1. 使用`@interface`关键字来定义注解,可以在注解中设置属性。 2. 可以通过注解的属性来传递数,比如设置注解中的属性值。 3. 可以通过判断某个类是否有特定注解来进行相应的操作。 在SpringBoot中,自定义注解可以用于实现日志记录、定时器等功能。通过使用注解,可以简化代码,并提高开发效率。同时,自定义注解也是Spring框架中广泛应用的一种方式,可以在SpringMVC框架中使用注解来配置各种功能。而在SpringBoot框架中,更是将注解的使用推向了极致,几乎将传统的XML配置都替换为了注解。因此,对于SpringBoot来说,自定义注解是非常重要的一部分。123 #### 引用[.reference_title] - *1* *3* [springboot定义注解(含源码)](https://blog.csdn.net/yb546822612/article/details/88116654)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* [SpringBoot-自定义注解](https://blog.csdn.net/weixin_44809337/article/details/124366325)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值