精华内容
下载资源
问答
  • Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)java前言:因为前段时间忙于写接口,在接口中须要作不少的参数校验,本着简洁、高效的原则,便写了这个小工具供本身使用(内容缩减版,具体...

    Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)java

    前言:因为前段时间忙于写接口,在接口中须要作不少的参数校验,本着简洁、高效的原则,便写了这个小工具供本身使用(内容为缩减版,具体业务可自行扩展)app

    思路:使用Java反射机制,读取实体类属性头部注解,经过get方法获取参数值进行校验,若是为空则进行异常抛出。ide

    CheckNull.java 类工具

    package com.seesun2012.common.annotation;

    import java.lang.annotation.Documented;

    import java.lang.annotation.ElementType;

    import java.lang.annotation.Inherited;

    import java.lang.annotation.Retention;

    import java.lang.annotation.RetentionPolicy;

    import java.lang.annotation.Target;

    /**

    * 自定义注解:校验非空字段

    *

    * @author seesun2012@163.com

    *

    */

    @Documented

    @Inherited

    // 接口、类、枚举、注解

    @Target(ElementType.FIELD)

    //只是在运行时经过反射机制来获取注解,而后本身写相应逻辑(所谓注解解析器)

    @Retention(RetentionPolicy.RUNTIME)

    public @interface CheckNull {

    String message();

    }

    Userregister.java 类ui

    package com.seesun2012.common.entity;

    import java.io.Serializable;

    import com.seesun2012.common.annotation.CheckNull;

    /**

    * 用户注册实体类

    *

    * @author seesun2012@163.com

    *

    */

    public class Userregister implements Serializable{

    private static final long serialVersionUID = 1L;

    //自定义注解

    @CheckNull(message="用户名不能为空")

    private String userAccount;

    //自定义注解

    @CheckNull(message="密码不能为空")

    private String passWord;

    public String getUserAccount() { return userAccount; }

    public void setUserAccount(String userAccount) { this.userAccount = userAccount; }

    public String getPassWord() { return passWord; }

    public void setPassWord(String passWord) { this.passWord = passWord; }

    @Override

    public String toString() {

    StringBuilder sb = new StringBuilder();

    sb.append(getClass().getSimpleName());

    sb.append(" [");

    sb.append("Hash = ").append(hashCode());

    sb.append(", userAccount=").append(userAccount);

    sb.append(", passWord=").append(passWord);

    sb.append(", serialVersionUID=").append(serialVersionUID);

    sb.append("]");

    return sb.toString();

    }

    }

    CommonUtils.java 类this

    package com.seesun2012.common.utils;

    import java.beans.BeanInfo;

    import java.beans.Introspector;

    import java.beans.PropertyDescriptor;

    import java.lang.reflect.Field;

    import java.lang.reflect.Method;

    import java.util.List;

    import com.seesun2012.common.annotation.CheckNull;

    import com.seesun2012.common.exception.CustBusinessException;

    /**

    * 公共工具类

    *

    * @author seesun2012@163.com

    *

    */

    public class CommonUtils{

    /**

    * 经过反射来获取javaBean上的注解信息,判断属性值信息,而后经过注解元数据来返回

    */

    public static boolean doValidator(T clas){

    Class> clazz = clas.getClass();

    Field[] fields = clazz.getDeclaredFields();

    for (Field field : fields) {

    CheckNull checkNull = field.getDeclaredAnnotation(CheckNull.class);

    if (null!=checkNull) {

    Object value = getValue(clas, field.getName());

    if (!notNull(value)) {

    throwExcpetion(checkNull.message());

    }

    }

    }

    return true;

    }

    /**

    * 获取当前fieldName对应的值

    *

    * @param clas对应的bean对象

    * @param fieldNamebean中对应的属性名称

    * @return

    */

    public static Object getValue(T clas,String fieldName){

    Object value = null;

    try {

    BeanInfo beanInfo = Introspector.getBeanInfo(clas.getClass());

    PropertyDescriptor[] props = beanInfo.getPropertyDescriptors();

    for (PropertyDescriptor property : props) {

    if (fieldName.equals(property.getName())) {

    Method method = property.getReadMethod();

    value = method.invoke(clas, new Object[]{});

    }

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

    return value;

    }

    /**

    * 非空校验

    *

    * @param value

    * @return

    */

    public static boolean notNull(Object value){

    if(null==value){

    return false;

    }

    if(value instanceof String && isEmpty((String)value)){

    return false;

    }

    if(value instanceof List && isEmpty((List>)value)){

    return false;

    }

    return null!=value;

    }

    public static boolean isEmpty(String str){

    return null==str || str.isEmpty();

    }

    public static boolean isEmpty(List> list){

    return null==list || list.isEmpty();

    }

    private static void throwExcpetion(String msg) {

    if(null!=msg){

    throw new CustBusinessException(msg);

    }

    }

    }

    Result.java 类code

    package com.seesun2012.common.entity;

    import java.io.Serializable;

    import java.util.HashMap;

    public class Result extends HashMap implements Serializable {

    private static final long serialVersionUID = 1L;

    public static final Result SUCCEED = new Result(0, "操做成功");

    public Result(int status, String massage) {

    super();

    this.put("status", status).put("message", massage);

    }

    public Result put(String key, Object value) {

    super.put(key, value);

    return this;

    }

    public static Result build(int i, String message) {

    return new Result(i, message);

    }

    }

    CustBusinessException.java 类对象

    package com.seesun2012.common.exception;

    /**

    * 自定义异常类

    *

    * @author seesun2012@163.com

    *

    */

    public class CustBusinessException extends RuntimeException{

    private static final long serialVersionUID = 1L;

    public CustBusinessException(){

    }

    public CustBusinessException(String str){

    super(str);

    }

    public CustBusinessException(Throwable throwable){

    super(throwable);

    }

    public CustBusinessException(String str, Throwable throwable){

    super(str, throwable);

    }

    }

    TestUtils.java 类接口

    package com.seesun2012.test.utils;

    import com.seesun2012.common.entity.Result;

    import com.seesun2012.common.entity.Userregister;

    import com.seesun2012.common.utils.CommonUtils;

    public class TestUtils{

    public static void main(String[] args) {

    Userregister sss = new Userregister();

    sss.setUserAccount("asdflkjasokdfj");

    System.out.println(insertUser(sss));

    }

    public static Result insertUser(Userregister param){

    Result result = new Result(1, "新增失败");

    try {

    CommonUtils.doValidator(param);

    result = Result.build(0, "新增成功");

    } catch (Exception e) {

    result = Result.build(1, e.getMessage());

    }

    return result;

    }

    }

    结语:该用户暂未添加ip

    展开全文
  • Hibernate Validation自定义注解校验

    千次阅读 2018-01-19 13:14:35
    情景:需要对String类型的属性比如description进行验证,验证规则是当description为空时不进行正则校验,description不为空时进行正则校验。上述需求Hibernate Validation没有用于上述需求的注解,故自定义一个...
    1. 情景:需要对String类型的属性比如description进行验证,验证规则是当description为空时不进行正则校验,description不为空时进行正则校验。上述需求Hibernate Validation没有可用于上述需求的注解,故自定义一个注解并自定义校验规则。

    2. 自定义注解进行校验的步骤

      • 写一个校验注解,在注解中指定校验器类,校验注解与校验器一般一一对应。
      • 写一个校验器类并在校验器类中写校验逻辑,校验器必须实现ConstraintValidator<?, ?>接口,第一个参数是对应的注解,第二个参数是要校验的属性的类型
    3. 代码示例
      校验注解
    package com.kunlun.validation.annotation;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    import javax.validation.Constraint;
    import javax.validation.Payload;
    
    import com.kunlun.validation.validator.KlPatternValidator;
    
    /**
     * 自定义的校验注解
     * 规则:
     *  1.如果字符串为空串或者为null,则不进行正则校验
     *  2.如果字符串不为空串,则必须进行正则校验
     * @author xc
     * @date 2018年1月19日上午11:38:02
     */
    @Documented
    // 指定该注解可以使用的地方
    @Target(value= {ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    // 指定实际进行校验的校验器,该校验器是自己写的且必须实现ConstraintValidator接口
    @Constraint(validatedBy=KlPatternValidator.class)
    public @interface KlPattern {
        /*
         * 用于验证的注解下列这三个方法必须要,这是Hibernate Validation框架要求的,否则程序再在调用的时候会报错
         * default用于对属性给定默认值
         *  如果不给定默认值,则在使用注解的时候必须给属性指定属性值,否则报错
         *  给定默认值时,在使用注解的时候可以不用指定属性值
         */
        String message() default "不符合正则!";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    
        // 没加default给定默认值,使用注解的时候该属性必须赋值,否则报错
        String regex();
        // value属性,加上了default "mercy" 使得该属性在使用注解的时候可以不用输入也不会报错
        String value() default "mercy";
    }
    

    与上面校验注解对应的校验器类

    package com.kunlun.validation.validator;
    
    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    
    import com.kunlun.validation.annotation.KlPattern;
    
    /**
     * KlPatternValidator是KlPattern注解实际调用的验证器
     * 在KlPatternValidator中完成校验逻辑
     * 
     * @author xc
     * @date 2018年1月19日上午11:44:38
     */
    public class KlPatternValidator implements ConstraintValidator<KlPattern, String> {
    
        private String regex;
    
        /**
         * 通过initialize()可以获取注解里的属性值
         */
        @Override
        public void initialize(KlPattern constraintAnnotation) {
            ConstraintValidator.super.initialize(constraintAnnotation);
            regex = constraintAnnotation.regex();
        }
    
        /**
         * 实际验证逻辑
         *  返回值为true表示验证通过,
         *  返回值为false表示验证未通过
         */
        @Override
        public boolean isValid(String s, ConstraintValidatorContext ctx) {
    
            // 当前前端传过来的请求参数是空串,或者没传的时候,不进行后续正则校验
            if ("".equals(s) || s == null) {
                return true;
            }
    
            // 进行正则校验
            if(s.matches(regex)) {
                return true;
            }
    
            return false;
        }
    
    }
    
    展开全文
  • 情景:需要对String类型的属性比如description进行验证,验证规则是当description为空时不进行正则校验,description不为空时进行正则校验。上述需求Hibernate Validation没有用于上述需求的注解,故自定义一个...

    情景:需要对String类型的属性比如description进行验证,验证规则是当description为空时不进行正则校验,description不为空时进行正则校验。上述需求Hibernate Validation没有可用于上述需求的注解,故自定义一个注解并自定义校验规则。

    自定义注解进行校验的步骤

    写一个校验注解,在注解中指定校验器类,校验注解与校验器一般一一对应。

    写一个校验器类并在校验器类中写校验逻辑,校验器必须实现ConstraintValidator, ?>接口,第一个参数是对应的注解,第二个参数是要校验的属性的类型

    代码示例

    校验注解

    package com.kunlun.validation.annotation;

    import java.lang.annotation.Documented;

    import java.lang.annotation.ElementType;

    import java.lang.annotation.Retention;

    import java.lang.annotation.RetentionPolicy;

    import java.lang.annotation.Target;

    import javax.validation.Constraint;

    import javax.validation.Payload;

    import com.kunlun.validation.validator.KlPatternValidator;

    /**

    * 自定义的校验注解

    * 规则:

    * 1.如果字符串为空串或者为null,则不进行正则校验

    * 2.如果字符串不为空串,则必须进行正则校验

    * @author xc

    * @date 2018年1月19日上午11:38:02

    */

    @Documented

    // 指定该注解可以使用的地方

    @Target(value= {ElementType.FIELD})

    @Retention(RetentionPolicy.RUNTIME)

    // 指定实际进行校验的校验器,该校验器是自己写的且必须实现ConstraintValidator接口

    @Constraint(validatedBy=KlPatternValidator.class)

    public @interface KlPattern {

    /*

    * 用于验证的注解下列这三个方法必须要,这是Hibernate Validation框架要求的,否则程序再在调用的时候会报错

    * default用于对属性给定默认值

    * 如果不给定默认值,则在使用注解的时候必须给属性指定属性值,否则报错

    * 给定默认值时,在使用注解的时候可以不用指定属性值

    */

    String message() default "不符合正则!";

    Class>[] groups() default {};

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

    // 没加default给定默认值,使用注解的时候该属性必须赋值,否则报错

    String regex();

    // value属性,加上了default "mercy" 使得该属性在使用注解的时候可以不用输入也不会报错

    String value() default "mercy";

    }

    与上面校验注解对应的校验器类

    package com.kunlun.validation.validator;

    import javax.validation.ConstraintValidator;

    import javax.validation.ConstraintValidatorContext;

    import com.kunlun.validation.annotation.KlPattern;

    /**

    * KlPatternValidator是KlPattern注解实际调用的验证器

    * 在KlPatternValidator中完成校验逻辑

    *

    * @author xc

    * @date 2018年1月19日上午11:44:38

    */

    public class KlPatternValidator implements ConstraintValidator {

    private String regex;

    /**

    * 通过initialize()可以获取注解里的属性值

    */

    @Override

    public void initialize(KlPattern constraintAnnotation) {

    ConstraintValidator.super.initialize(constraintAnnotation);

    regex = constraintAnnotation.regex();

    }

    /**

    * 实际验证逻辑

    * 返回值为true表示验证通过,

    * 返回值为false表示验证未通过

    */

    @Override

    public boolean isValid(String s, ConstraintValidatorContext ctx) {

    // 当前前端传过来的请求参数是空串,或者没传的时候,不进行后续正则校验

    if ("".equals(s) || s == null) {

    return true;

    }

    // 进行正则校验

    if(s.matches(regex)) {

    return true;

    }

    return false;

    }

    }

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • java相关:Hibernate Validation自定义注解校验的实现发布于 2020-3-13|复制链接摘记: 情景:需要对String类型的属性比如description进行验证,验证规则是当description为空时不进行正则校验,description不为空时...

    java相关:Hibernate Validation自定义注解校验的实现

    发布于 2020-3-13|

    复制链接

    摘记: 情景:需要对String类型的属性比如description进行验证,验证规则是当description为空时不进行正则校验,description不为空时进行正则校验。上述需求Hibernate Validation没有可用于上述需求的注解,故自定义一个注解并自定义校验规则。 ..

    情景:需要对String类型的属性比如description进行验证,验证规则是当description为空时不进行正则校验,description不为空时进行正则校验。上述需求Hibernate Validation没有可用于上述需求的注解,故自定义一个注解并自定义校验规则。自定义注解进行校验的步骤 写一个校验注解,在注解中指定校验器类,校验注解与校验器一般一一对应。

    写一个校验器类并在校验器类中写校验逻辑,校验器必须实现ConstraintValidator接口,第一个参数是对应的注解,第二个参数是要校验的属性的类型

    代码示例

    校验注解

    ```java

    package com.kunlun.validation.annotation;

    import java.lang.annotation.Documented;

    import java.lang.annotation.ElementType;

    import java.lang.annotation.Retention;

    import java.lang.annotation.RetentionPolicy;

    import java.lang.annotation.Target;

    import javax.validation.Constraint;

    import javax.validation.Payload;

    import com.kunlun.validation.validator.KlPatternValidator;

    /**

    * 自定义的校验注解

    * 规则:

    * 1.如果字符串为空串或者为null,则不进行正则校验

    * 2.如果字符串不为空串,则必须进行正则校验

    * @author xc

    * @date 2018年1月19日上午11:38:02

    */

    @Documented

    // 指定该注解可以使用的地方

    @Target(value= {ElementType.FIELD})

    @Retention(RetentionPolicy.RUNTIME)

    // 指定实际进行校验的校验器,该校验器是自己写的且必须实现ConstraintValidator接口

    @Constraint(validatedBy=KlPatternValidator.class)

    public @interface KlPattern {

    /*

    * 用于验证的注解下列这三个方法必须要,这是Hibernate Validation框架要求的,否则程序再在调用的时候会报错

    * default用于对属性给定默认值

    * 如果不给定默认值,则在使用注解的时候必须给属性指定属性值,否则报错

    * 给定默认值时,在使用注解的时候可以不用指定属性值

    */

    String message() default "不符合正则!";

    Class[] groups() default {};

    Class[] payload() default {};

    // 没加default给定默认值,使用注解的时候该属性必须赋值,否则报错

    String regex();

    // value属性,加上了default "mercy" 使得该属性在使用注解的时候可以不用输入也不会报错

    String value() default "mercy";

    }

    ```

    与上面校验注解对应的校验器类

    ```java

    package com.kunlun.validation.validator;

    import javax.validation.ConstraintValidator;

    import javax.validation.ConstraintValidatorContext;

    import com.kunlun.validation.annotation.KlPattern;

    /**

    * KlPatternValidator是KlPattern注解实际调用的验证器

    * 在KlPatternValidator中完成校验逻辑

    *

    * @author xc

    * @date 2018年1月19日上午11:44:38

    */

    public class KlPatternValidator implements ConstraintValidator {

    private String regex;

    /**

    * 通过initialize()可以获取注解里的属性值

    */

    @Override

    public void initialize(KlPattern constraintAnnotation) {

    ConstraintValidator.super.initialize(constraintAnnotation);

    regex = constraintAnnotation.regex();

    }

    /**

    * 实际验证逻辑

    * 返回值为true表示验证通过,

    * 返回值为false表示验证未通过

    */

    @Override

    public boolean isValid(String s, ConstraintValidatorContext ctx) {

    // 当前前端传过来的请求参数是空串,或者没传的时候,不进行后续正则校验

    if ("".equals(s) || s == null) {

    return true;

    }

    // 进行正则校验

    if(s.matches(regex)) {

    return true;

    }

    return false;

    }

    }

    ```

    展开全文
  • 自定义注解,来对对应的方法进行入参校验,为空返回参数错误 新建注解类@interface ParamsVerify @Target(ElementType.METHOD)//枚举,表示注解可能出现在的地方 @Retention(RetentionPolicy.RUNTIME)//运行时保留...
  • 1. hibernate validator注解在web项目中常常用到,是一个很好用的字段校验器,能够对前端传入的参数进行判断,如是否为空,是否知足正则规定的格式等等。前端2. 假设有一个业务场景,须要判断前端传入的用户是否存在...
  • * Jackson2JsonRedisSerializer - 该转换器用于绑定到类型化的bean或未类型化的HashMap实例。 注意:对象被序列化为数组,反之亦然。 * JdkSerializationRedisSerializer - Java序列化Redis...
  • 在平时开发中,前端提交表单时,通常会校验一些数据的可行性,比如是否为空,长度,身份证,邮箱等等,不过这样的验证是否就足够了呢,答案肯定是否定的。一个可靠的系统,不仅仅要依靠前端的数据验证,后端的验证也...
  • 注:本节阅读需要有MVC 自定义验证的基础,否则比较吃力 一直以来表单的验证都是不或缺的,微软的东西还是做得比较人性化的,从webform到MVC,都做到了双向验证 ...不为空验证 [Required(ErrorMessage = "不...
  • 系列目录 注:本节阅读需要有MVC 自定义验证的基础,否则比较吃力 一直以来表单的验证都是不或缺的,微软的东西还是做得比较人性化的,从webform到MVC,都做到了双向验证 ...不为空验证 [Required(...
  • 该块代码支持多个数据源, 默认额外数据源为空, 通过配置文件水平扩展到无限个(理论值)而不需要修改代码。 切换数据源有两种方式, 第一种通过注解在方法上指定其数据源(后续若不切换则一直是该数据源), 第二种...
  • 添加fastjson解析,解决部分调用对象内包含对象传值为空问题 20180921 Doc 目录结构调整 记录elk+kafka+logback服务之间调用多1分钟时间之坑 20180927 elk+logstash+logback解析嵌套json数据 20180930 添加...
  • 就是为了方便创建复杂对象,构建对象有很多方式,什么采用这种方式,方便。 通过构造函数创建对象 通过创建对象然后set属性 自定义不同参数的构造函数 lombok提供的注解@Builder链式调用 场景 当一个类的...
  • 系统使用自定义权限注解@mayfly.core.permission.Permission来控制用户的操作权限(即后端接口调用的权限,实时禁用以及删除权限),和通过权限code控制前端页面的列表权限以及按钮权限(显示与否,以及是否禁用...
  • cms后台管理

    热门讨论 2012-06-26 10:41:19
    Jeecms是基于Spring注解,在自定义标签时对于实体类和dao service等注意注解的问题。 五 自定义标签及使用自己创建的表的实现过程 下面是我自己定义的标签mycontent_list 首先,在数据库里创建了一个jc_...
  • .# 修正生成分类为空分类时出错的Bug; V1.13 (2009年11月30日发布) .#增加在线升级功能,自动判断升级,方便及时修复bug和后续版本升级; .#对程序进行优化,增强程序兼容性,运行效率更高; .#增加批量导入...
  • .# 修正生成分类为空分类时出错的Bug; V1.13 (2009年11月30日发布) .#增加在线升级功能,自动判断升级,方便及时修复bug和后续版本升级; .#对程序进行优化,增强程序兼容性,运行效率更高; .#增加批量导入...
  • 11.2.4 使用@Repeatable标记重复注解 273 11.3 使用注解 273 11.3.1 提取注解信息 273 11.3.2 使用注解的示例 274 11.4 Java注解与Kotlin的兼容性 279 11.4.1 指定注解的作用目标 279 11.4.2 使用Java注解 ...
  • 【自动填充】 不同于EXCEL的CTRL+D功能,能对选中的某列数据不同存储格区域的空白处,取相邻的上一不为空的存储格内容同时作数据源的自动填充。1分钟内能处理手工需几小时才能完成的几万行ERP或KingDee原始数据。...
  • 修改load的方法名selectByPrimaryKey,修改xml的update语句新增动态if判,修改xml的insert语句新增动态插入判,更符合mybatisGenerator标准(感谢@Archer-Wen的贡献 ). 2019.04.29 新增返回封装工具类设置. 优化...
  • spring.redis.password= # Redis服务器连接密码(默认为空) spring.redis.pool.max-active=200 # 连接池最大连接数(使用负值表示没有限制)) spring.redis.pool.max-wait=-1 # 连接池最大阻塞等待时间(使用负值...
  • javaSE代码实例

    2016-06-21 22:30:18
    17.1.5 变尺寸线程池的使用 378 17.1.6 延迟线程池的使用 380 17.1.7 使用自定义参数的线程池 381 17.2 有返回值的线程调用 384 17.2.1 Callable接口简介 384 17.2.2 Future接口简介 384 17.2.3 ...
  • 修复 WheelView在初始化时,数据为空导致height=0,造成一直显示不出来的问题。 新增取消按钮的点击事件监听入口。 参数注解添加,规范数据类型。 废弃setBackgroundId方法, 更新方法命名为 setOutSideColor。 更...
  • EXCEL集成工具箱V6.0

    2010-09-11 01:44:37
    财 务 工 具 【自动填充】 不同于EXCEL的CTRL+D功能,能对选中的某列数据不同存储格区域的空白处,取相邻的上一不为空的存储格内容同时作数据源的自动填充。1分钟内能处理手工需几小时才能完成的几万行ERP或KingDee...
  • 【自动填充】 不同于EXCEL的CTRL+D功能,能对选中的某列数据不同存储格区域的空白处,取相邻的上一不为空的存储格内容同时作数据源的自动填充。1分钟内能处理手工需几小时才能完成的几万行ERP或KingDee原始数据。...
  • 12864液晶图片取模软件

    热门讨论 2010-01-11 22:53:20
    在您的C语言程序中,有一点需要特别留意:您的注解中请不要使用双引号,否则会引起 提取错误。 软件包中的文件ee.c作为一个简单例程供提取测试用。 2。提取以后的点阵码可以随意修改点阵数据,使用鼠标的左键...
  • 财 务 工 具 【自动填充】 不同于EXCEL的CTRL+D功能,能对选中的某列数据不同存储格区域的空白处,取相邻的上一不为空的存储格内容同时作数据源的自动填充。1分钟内能处理手工需几小时才能完成的几万行ERP或KingDee...

空空如也

空空如也

1 2 3
收藏数 57
精华内容 22
关键字:

自定义注解可为空