java annotation校验器

前言

java annotation校验器,使用简单,可扩展,可以显著提升开发效率,参考网上例子写了个小例子,比较简单,明白即可

我的理解

Annotation信息可以被编译进class文件,也可以保留在Java 虚拟机中,从而在运行时可以获取,这里充分展示了反射的魅力

实例

注解类

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.PARAMETER })
public @interface Validate {
    //是否可以为空
    boolean nullable() default false;

    //最大长度
    int maxLength() default 0;

    //最小长度
    int minLength() default 0;

    //参数或者字段描述,这样能够显示友好的异常信息
    String description() default "";
}

校验器

public class ValidateService {
    private static Validate validate;

    //解析的入口
    public static void valid(Object object) throws Exception {
        //获取object的类型
        Class<? extends Object> clazz = object.getClass();
        //获取该类型声明的成员
        Field[] fields = clazz.getDeclaredFields();
        //遍历属性
        for (Field field : fields) {
            //对于private私有化的成员变量,通过setAccessible来修改器访问权限
            field.setAccessible(true);
            validate(field, object);
            //重新设置会私有权限
            field.setAccessible(false);
        }
    }

    public static void validate(Field field, Object object) throws Exception {
        //获取对象的成员的注解信息
        validate = field.getAnnotation(Validate.class);
        Object value = field.get(object);

        if (validate == null)
            return;
        String description = validate.description().equals("") ? field.getName() : validate.description();
        /*************注解解析工作开始******************/
        if (!validate.nullable()) {
            if (value == null || StringUtils.isBlank(value.toString())) {
                throw new Exception(description+"不能为空");
            }
        }
        if (value != null) {
            if (value.toString().length() > validate.maxLength() && validate.maxLength() != 0) {
                throw new Exception(description+"长度不能超过" + validate.maxLength());
            }


            if (value.toString().length() < validate.minLength() && validate.minLength() != 0) {
                throw new Exception(description+"长度不能小于" + validate.minLength());
            }
        }

        /*************注解解析工作结束******************/
    }
}

要校验的类

public class User {
    @Validate(description = "用户名", minLength = 2, maxLength = 32)
    private String  name;
    @Validate(description = "用户住址", minLength = 2, maxLength = 32)
    private String  address;
    @Validate(description = "用户年龄", nullable = false)
    private Integer age;


    public User(String name, String address, Integer age) {
        this.name = name;
        this.address = address;
        this.age = age;
    }


    /**
     * Getter method for property <tt>name</tt>.
     * 
     * @return property value of name
     */
    public String getName() {
        return name;
    }


    /**
     * Setter method for property <tt>name</tt>.
     * 
     * @param name value to be assigned to property name
     */
    public void setName(String name) {
        this.name = name;
    }


    /**
     * Getter method for property <tt>address</tt>.
     * 
     * @return property value of address
     */
    public String getAddress() {
        return address;
    }


    /**
     * Setter method for property <tt>address</tt>.
     * 
     * @param address value to be assigned to property address
     */
    public void setAddress(String address) {
        this.address = address;
    }


    /**
     * Getter method for property <tt>age</tt>.
     * 
     * @return property value of age
     */
    public Integer getAge() {
        return age;
    }


    /**
     * Setter method for property <tt>age</tt>.
     * 
     * @param age value to be assigned to property age
     */
    public void setAge(Integer age) {
        this.age = age;
    }
}

测试

public class AnnotationTest {


   
    public static void main(String[] args) {
        User user = new User("kobebryant", "la.lakers", null);
        try {
            ValidateService.valid(user);
            System.out.println("符合输入规则!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

执行结果


总结

1.可以看到程序运行时,通过反射读取待校验类的信息,进行校验

2.关于里面元注解和反射的东西自己理解吧

3. 可以看到,这种校验方式非常方便,但有一个很不好的缺点,嵌入代码太深,要修改的话会比较麻烦。所以使用根据具体业务来吧



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,拦截(Interceptor)是一种常见的设计模式,用于在方法调用之前或之后添加额外的逻辑处理。在Web开发中,拦截常用于处理请求、验证用户身份、记录日志等操作。下面是一个简单的示例,演示如何实现一个拦截。 首先,创建一个拦截类,实现Spring框架的`HandlerInterceptor`接口。该接口定义了三个方法,分别对应请求处理前、请求处理后和请求完成后的操作。 ```java import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在请求处理前执行的逻辑 // 返回true表示继续执行后续操作,返回false表示中断请求处理 return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 在请求处理后执行的逻辑 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在请求完成后执行的逻辑 } } ``` 接下来,配置拦截类,让它生效。可以通过Spring配置文件或注解的方式进行配置。 通过Spring配置文件配置拦截: ```xml <!-- 配置拦截 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <!-- 拦截所有请求 --> <bean class="com.example.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors> ``` 通过注解配置拦截: ```java import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); // 拦截所有请求 } } ``` 以上示例中的`com.example.MyInterceptor`是自定义的拦截类,你可以根据实际需求来编写自己的拦截逻辑。在`preHandle`方法中可以进行请求的预处理,如验证用户身份、权限校验等;在`postHandle`方法中可以对响应进行处理;在`afterCompletion`方法中可以进行一些清理工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值