实现Spring mvc参数检查之前,我们先来大概了解一下java annotation:
java.lang.annotation提供了四种元注解,专门注解其他的注解(在自定义注解的时候,需要使用到元注解):
@Documented –注解是否将包含在JavaDoc中
@Retention –什么时候使用该注解
@Target –注解用于什么地方
@Inherited – 是否允许子类继承该注解
1.)@Retention– 定义该注解的生命周期
● RetentionPolicy.SOURCE : 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。
● RetentionPolicy.CLASS : 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式
● RetentionPolicy.RUNTIME : 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。
2.)Target – 表示该注解用于什么地方。默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括
● ElementType.CONSTRUCTOR:用于描述构造器
● ElementType.FIELD:成员变量、对象、属性(包括enum实例)
● ElementType.LOCAL_VARIABLE:用于描述局部变量
● ElementType.METHOD:用于描述方法
● ElementType.PACKAGE:用于描述包
● ElementType.PARAMETER:用于描述参数
● ElementType.TYPE:用于描述类、接口(包括注解类型) 或enum声明
3.)@Documented–一个简单的Annotations标记注解,表示是否将注解信息添加在java文档中。
4.)@Inherited – 定义该注释和子类的关系
@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了 @Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
好了,有了以上的介绍,现在开始进入正题:
1.先自定义一个注解类:
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface IsNotNull { String value() default ""; }
2. 再写一个解析注解的工具类:
import java.lang.reflect.Field; public class MyAnnotationUtil { public static String getIsNotNullInfo(Object obj){ try { Class> clazz = obj.getClass(); //获得私有的成员属性 Field[] fields = clazz.getDeclaredFields(); if(fields!=null && fields.length>0){ for(Field f : fields){ f.setAccessible(true); System.out.println(f.getName()); //判断IsNotNull注解是否存在 if(!f.isAnnotationPresent(IsNotNull.class)){ System.out.println(f.getName()+">>>>>"+f.isAnnotationPresent(IsNotNull.class)); continue; }else { System.out.println(f.getName()+">>>>>"+f.isAnnotationPresent(IsNotNull.class)); IsNotNull isNotNull = f.getAnnotation(IsNotNull.class); if(f.get(obj)==null || "".equals(f.get(obj))){ System.out.println(isNotNull.value()); return isNotNull.value(); } } } } }catch (Exception e){ return null; } return null; }
3.好了,最后进行Spring mvc参数检查的实现:
3.1 定义一个view,加入定义注解
public class Item implements Serializable { /** * */ private static final long serialVersionUID = 8663198447200449568L; @IsNotNull("名字不能为空") private String name; @IsNotNull("密码不能为空") private String pwd; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } }
3.1 实现Controller
@RestController public class MemberController { @RequestMapping(value="/getUserList",method=RequestMethod.POST) public ListgetUserList(@RequestBody Item item) { String string = MyAnnotationUtil.getIsNotNullInfo(item); System.out.println(string); if(string!=null){ //如果参数错误,直接返回 List listUser = new ArrayList (); listUser.add(string); return listUser; } System.out.println(item.getName() ); List listUser = new ArrayList (); listUser.add("zhangsan"); listUser.add("lisi"); listUser.add("yushengjun"); System.out.println("你调用了一次>>>>>>>"); return listUser; } }
好了,以上就是java annotation 之Spring mvc参数检查的简单实现。。。。。
大家还可以自定义更多的注解来检查参数,比如:对邮箱,对手机号,对身份证等等。。。。。