java annotation 之Spring mvc参数检查

本文介绍如何利用自定义注解实现SpringMVC中的参数校验。通过创建自定义注解`@IsNotNull`,结合反射机制,实现对传入参数的非空检查。此方法不仅简化了代码,还提高了程序的健壮性和易维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现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<String> getUserList(@RequestBody Item item) {
		String string = MyAnnotationUtil.getIsNotNullInfo(item);
                System.out.println(string);
		if(string!=null){ //如果参数错误,直接返回
			List<String> listUser = new ArrayList<String>();
			listUser.add(string);
			return listUser;
		}
		System.out.println(item.getName() );
		List<String> listUser = new ArrayList<String>();
		listUser.add("zhangsan");
		listUser.add("lisi");
		listUser.add("yushengjun");
		System.out.println("你调用了一次>>>>>>>");
		return listUser;
	}

	
}

 

 

好了,以上就是java annotation 之Spring mvc参数检查的简单实现。。。。。

大家还可以自定义更多的注解来检查参数,比如:对邮箱,对手机号,对身份证等等。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值