引言
参数校验始终不会少,但是如何让代码更加简洁?令人深思
接下来介绍一个参数验证工具
实现
注解
定义一个自定义注解
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 参数非空注解 */ @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.FIELD }) public @interface NotEmpty { /** * 是否非空。<br> * * @return */ boolean value() default true; /** * 错误信息描述 默认提示fieldName非空 * @return */ String message() default ""; }
判断工具
import java.lang.reflect.Field; import java.util.Collection; import java.util.Map; import com.alibaba.common.lang.StringUtil; import com.alibaba.global.ad.core.client.annotation.NotEmpty; import com.alibaba.global.ad.core.client.common.exception.ServiceException; import com.alibaba.global.ad.core.client.common.result.ResultCode; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; /** * 断言检查工具类 * 抽象,防止直接实例化 * */ public class GenericCheckUtil { /** * 是有构造,防止被实现 */ private GenericCheckUtil() { } /** * 校验参数(推荐) * * @param param 不能为空 */ public static void check(Object param) { if (param == null) { throw new ServiceException(ResultCode.ILLEGAL_PARAM); } for (Field field : param.getClass().getDeclaredFields()) { field.setAccessible(true); NotEmpty notEmpty = field.getAnnotation(NotEmpty.class); if (notEmpty == null || !notEmpty.value()) { continue; } Object value; try { value = field.get(param); } catch (IllegalAccessException e) { throw new RuntimeException(e); } // null判断 if (value == null) { throwException(field, notEmpty); } // String判断 if (value instanceof String && StringUtil.isBlank((String)value)) { throwException(field, notEmpty); } // 集合判断 if (value instanceof Collection && CollectionUtils.isEmpty((Collection<?>)value)) { throwException(field, notEmpty); } if (value instanceof Map && CollectionUtils.isEmpty((Map)value)) { throwException(field, notEmpty); } } } /** * 抛出异常 * * @param field * @param notEmpty */ private static void throwException(Field field, NotEmpty notEmpty) { throw new ServiceException(ResultCode.ILLEGAL_PARAM, StringUtil.isBlank(notEmpty.message()) ? field.getName() + "不能为空" : notEmpty.message()); } }
使用
DTO定义
判断