前言:
现时姐妹们对“java注解参数”大体比较讲究,姐妹们都想要学习一些“java注解参数”的相关文章。那么小编在网上搜集了一些有关“java注解参数””的相关内容,希望你们能喜欢,咱们快快来学习一下吧!在项目开发中,当使用配置文件的时候,需要对一些配置参数进行合法校验,如果不存在则会抛出异常或者提醒用户重新修改配置文件后运行系统。 以前的做法就是读取到配置文件后,每个配置项挨个检查,写多个if判断是否存在问题。 这样可以实现功能需要,但是后续的维护工作是一个很大的问题。 增加某一项配置后,需要增加一个if判断。 如果漏掉一个判断,则可能会因为取到一个语言层面的类型的默认值,就会造成一些不可挽回的损失。 由于java提供了注解和反射,这样可以利用注解把参数的规格及发生异常时候的提示信息通过注解组织起来。然后提供一个统一的校验工具函数实现对参数项的校验。
实现目标
实现一个基本的配置项是否为空的统一的校验函数。 只对参数进行是否为空的判断,并且在为空的时候可以抛出指定的错误信息。
实现思路
定义一个注解,主要描述一个字段是否允许为空和一个为空时候的异常信息。定义如下:
class名:ValidField
package com.lehoon.cfets.rdi.annotation;import java.lang.annotation.*;/** * @Title: ValidField * @ProjectName: cfets-rdi * @Description: 合法校验注解定义 * @Author: lehoon * @Date: 2019/6/24 15:06 **/@Documented@Inherited@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD})public @interface ValidField { /** * 是否必须有值 * @return */ boolean empty() default false; /** * 错误消息 * @return */ String message() default "";}
怎么使用呢, 直接在类的成员变量上面,增加注解及注解说明。例如:
package com.lehoon.cfets.rdi.entity;import com.lehoon.cfets.rdi.annotation.ValidField;/** * @Title: RdiSystemConfig * @ProjectName: cfets-rdi * @Description: rdi参数配置 * @Author: lehoon * @Date: 2019/6/11 14:26 **/public class RdiSystemConfig { /** * imix报文目录 */ @ValidField(message = "rdi文件存放目录没有设置参数") private String path; @ValidField(message = "rdi文件后缀名没有设置") private String suffix; @ValidField(message = "rdi文件输出目录没有设置参数") private String outPath; @ValidField(message = "rdi文件名分隔符没有设置参数") private String matchSplit; @ValidField(message = "rdi文件匹配索引位没有设置参数") private Integer matchIndex; @ValidField(message = "rdi文件日期差没有设置参数") private Integer dateAmount; @ValidField(message = "rdi文件存放目录时间格式没有设置参数") private String dataFormat;}
具体实现的逻辑代码如下:
package com.lehoon.cfets.rdi.utils;import com.lehoon.cfets.rdi.annotation.ValidField;import java.lang.reflect.Field;/** * @Title: ValidUtils * @ProjectName: cfets-rdi * @Description: TODO * @Author: lehoon * @Date: 2019/6/24 15:04 **/public class ValidUtils { private static String message = StringUtils.EMPTY; public static boolean valid(Object object) { Class objClass = object.getClass(); Field[] fields = objClass.getDeclaredFields(); if (fields != null && fields.length > 0) { //获取注解 for(Field field : fields) { ValidField validField = field.getAnnotation(ValidField.class); if (validField == null || validField.empty()) { continue; } boolean accessFlag = field.isAccessible(); field.setAccessible(true); Object value; try { value = field.get(object); } catch (IllegalAccessException e) { field.setAccessible(accessFlag); continue; } if(value == null) { message = validField.message(); field.setAccessible(accessFlag); return false; } String fieldType = field.getType().getSimpleName(); if(checkFieldEmpty(value, fieldType)) { message = validField.message(); field.setAccessible(accessFlag); return false; } //还原权限 field.setAccessible(accessFlag); } } return true; } //如果是string类型,则进行是否为空处理 private static boolean checkFieldEmpty(Object value, String type) { if("string".equalsIgnoreCase(type)) { String content = StringUtils.trimToEmpty((String) value); return StringUtils.isEmpty(content); } return false; } public static String message() { return message; }}使用方法
//获取目录下的符合规则的文件列表 RdiSystemConfig config = (RdiSystemConfig) IFXGlobalApplicationContext.getBean("rdiSystemConfig"); if(config == null) { System.err.println("没有找到系统配置参数,请检查配置项是否存在."); logger.error("没有找到系统配置参数,请检查配置项是否存在."); return; } if(!ValidUtils.valid(config)) { logger.error(String.format("配置文件不正确, %s, 请检查项目配置文件.", ValidUtils.message())); return; }
后续如果再增加配置项,直接声明配置属性即可, 不需要额外增加代码进行有效性校验代码。 如果有其他逻辑处理,也可以扩展注解和校验实现代码逻辑即可。
标签: #java注解参数