实现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 List getUserList(@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参数检查的简单实现。。。。。
大家还可以自定义更多的注解来检查参数,比如:对邮箱,对手机号,对身份证等等。。。。。