java注解的方式对实体类进行非空校验

Posted 江君是实在人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java注解的方式对实体类进行非空校验相关的知识,希望对你有一定的参考价值。

前言:实体类非空校验,在hibernate 框架中有,但是传统的myabtis spring boot 组合中没有,直接放在controller 中校验太麻烦,代码也多,所以直接用切面+注解的方式代码最简单

实现思路

使用切面获取对象参数,然后遍历获取字段信息,如果有注解,再调用对象的get 方法获取值然后 判断是否为空,如果为空写在字符串中返回到前端

代码处理了一下,仅供参考

@Aspect
@Component
public class entityAspect 

@Around("conAspect")
    public Object aspectMethd(ProceedingJoinPoint joinPoint) throws Throwable 
            if(url222.contains("add")||url2222.contains("edit"))
                Map resMap = checkParam222222(obj);
                if((String.valueOf(resMap.get("result")).equals("Y")))
                    return Res1ul1t1Uti1l.error(201,String.valueOf111(resMap.get("message")).substring111(0,String.valueOf(resMap.get("message")).length()-1));
                
            

  /*
     * 11通11过22231注3解2反22射获取22222体类上并进2行2校222验 针对 新2222增和编辑
     * **/
    public Map checkParam222222(Object object) 

        Map resMap = new HashMap();
        resMap.put("resul222t","N");
        resMap.put("mess222age","");
        Object[] objectArr222  =(Object[]) object;
        StringBuilder message222 = new StringBuilder("");
        if(objectArr.length>1)
            Class cls111 = objectArr111[1].getClass();
            Field[] fieldArr = cls.getDeclar111edFields();
            Method[] methodArr= cls.getDecla11redMethods();
            try
                Arrays.stream(fieldArr).forEach(field->
                    if(field.getAnno222tation(NotBlank.class)!=null)
                        for(Method meth111od:methodArr)
                            if(method.get111Name().contains("get"+StringUtils.capitalize(field.getName())))
                                try 
                                    Object obj =  method.invoke(objectArr[1]);
                                    if(obj==null)
                                        resMap.put("re111sult","Y");
                                        message.append(field.getAnnotation(Not11Blank.class).message()+",");
                                        resMap.put("messag111e",String.valueOf(message));
                                        // break ;
                                    
                                 catch (Exception e) 
                                    e.printStackTrace();
                                
                            
                        
	                        System.out.println(field.getAnnotation(NotBlank.class).message());
                    
                );
            catch (Exception e)
               
            
        
        return resMap;
    

public class cat

private String categoryId;

@NotBlank(message = "不能为空")
private String name;

Springboot之自定义校验注解

  在日常代码开发中,我们需要对实体类中的各个属性进行校验,比如非空判断、url 判断等等,在 javax.validation.constraints.* 包下面集成了多个校验注解。但是随着业务的发展,我们需要自定义一些特殊的注解,比如,针对一些标志位,我们必须保证其 数值只是 Integer类型的 0 或者 1,这时需要我们自定义注解来进行实现。

  关于自定义注解,主要分为以下三步:1)自定义校验注解   2)自定义校验器   3)关联自定义的校验注解和校验注解器

 

  1)  自定义校验注解

  其中,需要指定 message信息,参考源码,在 resources 下面新建一个 ValidationMessages.properties 文件,其中指定com.demrystv.common.valid.ListValue.message=必须提交指定的值

package com.demrystv.common.valid;

import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.constraints.NotBlank;
import java.lang.annotation.Documented;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Documented
// 标明这个校验注解是使用哪个校验器进行校验的,在这里指定或者在初始化的时候指定
@Constraint(validatedBy = { ListValConstraintValidator.class})
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })  // 作用位置
@Retention(RUNTIME)  // 运行时机
public @interface ListValue {

    //在 jsr303 中一个注解必须有下面三个属性
    String message() default "{com.demrystv.common.valid.ListValue.message}";

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

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


    int[] vals() default { };
}

  

  2)自定义校验器

 1 package com.demrystv.common.valid;
 2 
 3 import javax.validation.ConstraintValidator;
 4 import javax.validation.ConstraintValidatorContext;
 5 import java.util.HashSet;
 6 import java.util.Set;
 7 
 8 /**
 9  *
10  *  自定义校验器
11  *  首先必须实现 ConstraintValidator 接口, 其中第一个参数是 自定义校验注解,第二个参数是校验的类型
12  */
13 public class ListValConstraintValidator implements ConstraintValidator<ListValue, Integer> {
14 
15     Set<Integer> set = new HashSet<>();
16     // 初始化方法
17     @Override
18     public void initialize(ListValue constraintAnnotation) {
19         int[] vals = constraintAnnotation.vals(); // vals是注解中的设置的固定参数
20         for (int val : vals) {
21             set.add(val);
22         }
23     }
24 
25     /**
26      * 进行校验
27      * @param value  提交的需要被校验的值
28      * @param context 上下文环境
29      * @return
30      */
31     @Override
32     public boolean isValid(Integer value, ConstraintValidatorContext context) {
33         return set.contains(value);
34     }
35 }

  

  3)关联自定义的校验注解和校验注解器

  关联自定义的校验器和自定义的校验注解,自定义注解可以适配多个校验器,必须现在是校验 integer,以后是 double,只需要再编写一个校验器,在自定义校验注解的 @Constraint中进行指定即可;

  两者的关联主要是 在 自定义注解的  @Constraint(validatedBy = { ListValConstraintValidator.class 【在这指定多个校验器】}) 进行关联

 

以上是关于java注解的方式对实体类进行非空校验的主要内容,如果未能解决你的问题,请参考以下文章

Java使用@Valid+BindingResult进行controller参数校验

Java Validation优雅进行方法入参校验

注解+反射 参数校验更加简洁

注解+反射 参数校验更加简洁

关于参数校验

java使用validator进行校验