`
huangyongxing310
  • 浏览: 498637 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

自定义注解检测数据有效性

 
阅读更多
自定义注解检测数据有效性



package com.midea.common;

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;


@Target(ElementType.FIELD)  
@Retention(RetentionPolicy.RUNTIME)  
@Inherited  
@Documented  
public @interface ModelFieldValidity {  
     long  max() default Long.MAX_VALUE;
     long  min() default Long.MIN_VALUE;   
     long  maxLen() default Long.MAX_VALUE;
     long  minLen() default Long.MIN_VALUE;    
     boolean enableNull() default false;
}  





package com.midea.common.Model;

import com.midea.common.ModelFieldValidity;

public class DescriptionModel {
	@ModelFieldValidity(max = 15, min = 0)
	private int age;

	@ModelFieldValidity(max = 15, min = 0, enableNull = true)
	private Integer high;

	@ModelFieldValidity(maxLen = 8, minLen = 1, enableNull = true)
	private String name;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getHigh() {
		return high;
	}

	public void setHigh(int high) {
		this.high = high;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "DescriptionModel [age=" + age + ", high=" + high + ", name=" + name + "]";
	}

}



package com.midea.common;

import java.lang.reflect.Field;

public class ModelFieldValidityUtils {

	/**
	 * @param t
	 * @return 校验通过返回null,校验失败返回失败原因
	 */
	public static <T> String checkModelFields(T t) {
		String result = null;
		Field[] fields = t.getClass().getDeclaredFields();
		for (Field field : fields) {
			ModelFieldValidity modelFieldValidity = field.getAnnotation(ModelFieldValidity.class);
			if (null == modelFieldValidity) {
				continue;
			}
			try {
				field.setAccessible(true);
				Object object = field.get(t);

				// 判断是否可以为空
				if (null == object) {
					boolean enableNull = modelFieldValidity.enableNull();
					// System.out.println("enableNull == " + enableNull);
					if (!enableNull) {
						result = field.getName() + " is null";
						return result;
					} else {
						continue;
					}
				}

				if (object instanceof Number) {
					// Number比较
					Long max = modelFieldValidity.max();
					Long min = modelFieldValidity.min();
					// System.out.println("max == " + max);
					// System.out.println("min == " + min);
					// System.out.println("Number == " + object);
					int check = ModelFieldValidityUtils.check(max, min, (Number) object);
					if (check == 1) {
						result = field.getName() + " = " + object + " > max(" + max + ")";
						return result;
					} else if (check == -1) {
						result = field.getName() + " = " + object + " < min(" + min + ")";
						return result;
					} else {
						continue;
					}
				} else if (object instanceof String) {
					// String比较
					Long maxLen = modelFieldValidity.maxLen();
					Long minLen = modelFieldValidity.minLen();
					// System.out.println("maxLen == " + maxLen);
					// System.out.println("minLen == " + minLen);
					// System.out.println("String == " + object);
					int check = ModelFieldValidityUtils.check(maxLen, minLen, ((String) object).length());
					if (check == 1) {
						result = field.getName() + " Len = " + ((String) object).length() + " > maxLen(" + maxLen + ")";
						return result;
					} else if (check == -1) {
						result = field.getName() + " Len = " + ((String) object).length() + " < minLen(" + minLen + ")";
						return result;
					} else {
						continue;
					}
				}

			} catch (IllegalArgumentException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				result = e1.getMessage();
				return result;
			} catch (IllegalAccessException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				result = e1.getMessage();
				return result;
			}

		}
		return result;
	}

	private static <T extends Number> int check(T max, T min, T object) {
		if (object.doubleValue() > max.doubleValue()) {
			return 1;
		}

		if (object.doubleValue() < min.doubleValue()) {
			return -1;
		}

		return 0;
	}
}


package com.midea.common;

import java.lang.reflect.Field;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.midea.common.Model.DescriptionModel;

public class ModelFieldValidityUtilsTest {
	final static Logger logger = LogManager.getLogger(ModelFieldValidityUtilsTest.class);

	public static void main(String[] args) {
		DescriptionModel descriptionModel = new DescriptionModel();

		descriptionModel.setAge(1);
		descriptionModel.setHigh(1);
		descriptionModel.setName("asa");

		System.out.println("descriptionModel == " + descriptionModel.toString());

		// String result = null;

		String result = ModelFieldValidityUtils.checkModelFields(descriptionModel);

		System.out.println("result == " + result);

	}

}



参考原文:http://blog.csdn.net/maguanghui_2012/article/details/69372209












分享到:
评论

相关推荐

    Android注解基础介绍快速入门与解读

    自定义注解通常结合注解处理器(如Java的APT或Kotlin的KSP)一起使用,以便在编译期间生成额外的代码或执行特定的验证。 例如,创建一个自定义注解`@MyAnnotation`,可以这样定义: ```java @Retention...

    读写数据源通过事物注解进行读写切换

    当检测到方法上有特定的事务注解(比如自定义的`@ReadTransaction`和`@WriteTransaction`)时,拦截器会根据注解来选择使用读库还是写库。这通常涉及到数据源的切换,SpringBoot中可以使用AbstractRoutingDataSource...

    P14-Java语言补充1

    Java注解(Annotation)是自Java 5.0版本引入的一种元数据,它允许程序员在...通过自定义注解,开发者可以创建自己的元数据,以适应特定项目的需求和工作流程。在实际开发中,合理利用注解可以提高代码质量和开发效率。

    springboot+mybatis+druid 多数据源+redis+websocket+swagger2

    - 它可以集成 SQL 日志、连接有效性检测、SQL 执行统计等功能,有助于数据库性能优化和运维。 4. **Redis**: - Redis 是一个高性能的键值对内存数据库,常用于缓存和消息中间件。 - SpringBoot 中可以通过 `...

    全面剖析java中的注解(Annotation)

    下面将详细讨论Java注解的基本概念、用途以及如何创建自定义注解。 1. 什么是注解 注解是一种在Java源代码中添加的特殊声明,它不改变程序的基本结构和行为,而是为编译器、IDE、构建工具或其他工具提供元信息。...

    详解Java编程中Annotation注解对象的使用方法

    在Java编程中,Annotation(注解)是一种强大的元数据机制,它允许程序员在代码中嵌入额外的信息,这些信息可以在编译时或运行时被编译器或虚拟机...通过自定义注解和处理器,开发者可以构建出适应特定需求的解决方案。

    java注解_实现单位自适应

    首先,我们需要创建自定义注解,例如`@UnitAdaptive`,用于标记那些需要进行单位转换的方法或字段。这个注解可以包含一个或多个参数,如默认单位、允许的单位类型等。例如: ```java @Retention(RetentionPolicy....

    java连接池的开发,功能全面方面学习,技术多元化.rar

    - **连接检测与回收**:连接池定期检查连接状态,对过期或异常的连接进行回收,保证连接的有效性。 - **关闭连接池**:应用关闭时,正确关闭连接池,释放所有资源。 4. **最佳实践**: - **选择合适的连接池实现...

    防止接口重复提交方案.docx

    综上,通过自定义注解和拦截器,结合适当的缓存机制,可以有效地防止Java API接口的重复提交,从而保障系统的稳定性和数据的准确性。在实际项目中,还需要根据具体需求和系统架构进行相应的调整和优化。

    用注解把那些恶心的,或者有 Hack 功能的代码标注出来,每次调用 IDE 都会提醒你,这个函数调用有潜在风险.zip

    在本项目中,开发者可以自定义注解来标记那些潜在的“危险”代码,比如`@PotentiallyHarmful`或`@NeedsReview`,并在IDE中配置相应的警告提示。 插件的工作原理可能包括扫描源代码,查找特定注解,并与IDE的警告...

    springboot + mybatis + atomikos 多数据源分布式事物管理

    总之,通过 Spring Boot、MyBatis 和 Atomikos 的结合,我们可以有效地管理分布式环境中的多数据源事务,确保系统的稳定性和数据的一致性。在实际开发中,理解并熟练掌握这些技术的整合和配置是至关重要的。

    redis系列三springboot如何使用redis做缓存及缓存注解的用法总结.docx

    - **自定义RedisCacheManager**:通过`@Autowired`注入`RedisCacheManager`并重置默认过期时间,例如设置为100秒,以确保缓存的有效管理。 2. **初始化Redis缓存** Spring Boot通过`RedisCacheManager`来管理缓存...

    poi获取exccel有合并单元格的数据

    ### 使用Apache POI获取...这种方法不仅可以帮助开发者更方便地处理Excel数据,还可以提高程序的健壮性和数据的准确性。在实际应用中,还需要根据具体需求调整代码逻辑,比如增加异常处理机制、优化性能等方面的工作。

    Druid数据源配置监控页面(Demo)

    test-on-borrow: true # 借出连接时检测是否有效 test-on-return: true # 归还连接时检测是否有效 validation-query: SELECT 1 FROM DUAL # 验证查询语句 web-stat-filter: # Web监控统计过滤器 enabled: true ...

    用于数据标注的工具,打包成可执行文件,更易用

    数据标注是机器学习和人工智能领域中的关键步骤,它涉及到对大量数据进行人工注解,以训练模型理解并学习特定任务。在这个过程中,选择合适的工具至关重要,因为它直接影响到标注的效率和准确性。标题提到的“用于...

    关于java中对象属性值的校验的思考

    在Java编程中,对象属性值的校验是一个重要的实践环节,它确保了程序的数据完整性,防止因非法数据导致的运行时错误。这篇文章将探讨如何在Java中进行对象属性值的校验,以及相关的工具和源码分析。 首先,对象属性...

    spring注入web端校验类

    标题中的“spring注入web端校验类”指的是在Spring框架中,如何将验证逻辑整合到Web应用程序中,以便对用户输入的数据进行有效性检查。在Web应用中,数据验证是至关重要的,可以防止非法数据进入系统,确保数据的...

    使用Spring组合自定义的注释 mscharhag操作

    总结来说,使用Spring的自定义注释可以有效地整理和标准化代码,提高代码的可读性和可维护性。无论是组合已有的注解,还是封装常用的属性注入,或是简化测试配置,自定义注释都是一个非常实用的工具。在实际开发中,...

    valuelike:示例注释处理器

    `valuelike:示例注释处理器` 提供了一个关于如何创建自定义注解处理器的示例。这个项目可能不是一个实际用于生产环境的实现,但它对于学习和理解注解处理器的工作原理非常有帮助。 首先,让我们了解一下注解处理器...

    30天轻松掌握javaweb 课堂笔记完整版

    - XML Schema用于定义XML文档的结构和约束,确保数据的有效性。 13. **HTTP协议**: - 讲解了HTTP协议的定义、工作原理、请求和响应细节。 - 不同版本的HTTP协议(如HTTP 1.0和HTTP 1.1)的区别。 - Servlet...

Global site tag (gtag.js) - Google Analytics