前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java自定义校验参数类型范围

java自定义校验参数类型范围

作者头像
查拉图斯特拉说
发布2023-12-22 14:46:40
2510
发布2023-12-22 14:46:40
举报
文章被收录于专栏:后端架构

前言

像日常我们可能会进行一些枚举定义。一些状态的定义。这个时候你就需要去写一些。校验的方法和参数今天在小节,主要是讲如何自定义注解。来进行一个参数校验,非常的简单方便。

自定义注解

首先我们自定义一个圆类型的注解。标注这个注解的使用范围。然后什么时候去使用都是些常用的配置。

代码语言:javascript
复制
import com.*.sim.validator.LanguageValidator;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 语言类型验证注解
 * @author stevenchen
 */
@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = LanguageValidator.class)
public @interface Language {

    String message() default "语言类型错误";

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

    Class<? extends Payload>[] payload() default {};

}

验证逻辑

紧接着我们去编写这个注解调用的一些实现方法,初始化方法,还有一些校验方法。首先我们需要去继承相应的校验的一个公共的接口类。配置好相应的发型参数。接着只需要重写它的初始化方法,还有一些验证的方法就可以了,剩下的就我们这些需要编写一些类似的逻辑。

代码语言:javascript
复制
/**
 * 编译语言校验
 * @author Steven
 * @Date 2021/12/31 11:26
 */
public class LanguageValidator implements ConstraintValidator<Language, String> {

    @Override
    public void initialize(Language constraintAnnotation) {
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return LanguageEnum.isExist(value);
    }
}

配置到属性上面

就同样的,我们只需要在属性或者方法上面去加上这个注解。只需要加上这个注解就ok了,其他的你任何都不需要做。当我们去请求的时候,它自动会去校验这个方法里面的一些参数,如果你有兴趣的话,你也可以去看一下像这个非空的一个注解,它的实现逻辑基本上类似的,有些时候多看一下源码的话,这里是重写它的一些方法,非常的有帮助,因为它提供的注解可能不能适用所有的场景。

代码语言:javascript
复制
    /**
     * @see LanguageEnum
     */
    @ApiModelProperty(value = "请求语言类型小写,目前python|c++", required = true, example = "python")
    @NotBlank(message = "语言类型,不能为空")
    @Language
    private String language;

应用到接口

然后就是接口部分的实现结果的话,你只需要去加上对应的一些validate注解。他就会去校验相应的一些属性。这里使用的是一个表单提醒的方式,当然你也可以使用。Json的方式,但是前提一定要加一个validate注解。

代码语言:javascript
复制
    @PostMapping(value= "/run", consumes = { MediaType.MULTIPART_FORM_DATA_VALUE })
    public CommonResult<BacktestResultVo> run(HttpServletRequest request,
                                              @Validated @ModelAttribute BuildCodeDto buildCodeDto) {
    }

回顾

最后的话,我想说有的时候都去看看源码,学习别人的注解的实现方式。对实现一些校验的功能还是非常优雅的,自己实现一些注解可以使代码变得非常的简洁。

最后

点赞关注评论一键三连,每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 自定义注解
  • 验证逻辑
  • 配置到属性上面
  • 应用到接口
  • 回顾
  • 最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档