以上切面中 , 有几个点需要大家注意的:
- 1、使用@Around注解来指定对标注了OpLog的方法设置切面 。
- 2、使用Spel的相关方法 , 通过指定的表示 , 从对应的参数中获取到目标对象的唯一性标识 。
- 3、再方法执行成功后 , 输出日志 。
@RequestMApping(method = {RequestMethod.GET, RequestMethod.POST})@OpLog(opType = OpType.QUERY, opItem = "order", opItemIdExpression = "#id")public @ResponseBodyHashMap view(@RequestParam(name = "id") String id) throws Exception {}
上面这种是入参的参数列表中已经有了被操作的对象的唯一性标识 , 直接使用#id指定即可 。如果被操作的对象的唯一性标识不在入参列表中 , 那么可能是入参的对象中的某一个属性 , 用法如下:
@RequestMapping(method = {RequestMethod.GET, RequestMethod.POST})@OpLog(opType = OpType.QUERY, opItem = "order", opItemIdExpression = "#orderVo.id")public @ResponseBodyHashMap update(OrderVO orderVo) throws Exception {}
以上 , 即可从入参的OrderVO对象的id属性的值获取 。如果我们要记录的唯一性标识 , 在入参中没有的话 , 应该怎么办呢?最典型的就是插入方法 , 插入成功之前 , 根本不知道主键ID是什么 , 这种怎么办呢?
我们上面的切面中 , 做了一件事情 , 就是我们把方法的返回值也会使用表达式进行一次解析 , 如果可以解析得到具体的值 , 也是可以 。如以下写法:
@RequestMapping(method = {RequestMethod.GET, RequestMethod.POST})@OpLog(opType = OpType.QUERY, opItem = "order", opItemIdExpression = "#insertResult.id")public @ResponseBodyInsertResult insert(OrderVO orderVo) throws Exception { return orderDao.insert(orderVo);}
以上 , 就是一个简单的使用自定义注解+切面进行日志记录的场景 。下面我们再来看一个如何使用注解做方法参数的校验 。使用自定义注解做前置检查当我们对外部提供接口的时候 , 会对其中的部分参数有一定的要求 , 比如某些参数值不能为空等 。大多数情况下我们都需要自己主动进行校验 , 判断对方传入的值是否合理 。
这里推荐一个使用HibernateValidator + 自定义注解 + AOP实现参数校验的方式 。
首先我们会有一个具体的入参类 , 定义如下:
public class User { private String idempotentNo; @NotNull( message = "userName can't be null" ) private String userName;}
以上 , 对userName参数注明不能为null 。然后再使用Hibernate Validator定义一个工具类 , 用于做参数校验 。
/** * 参数校验工具 * @author Hollis */public class BeanValidator { private static Validator validator = Validation.byProvider(HibernateValidator.class).configure().failFast(true) .buildValidatorFactory().getValidator(); /** * @param object object * @param groups groups */ public static void validateObject(Object object, Class<?>... groups) throws ValidationException { Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups); if (constraintViolations.stream().findFirst().isPresent()) { throw new ValidationException(constraintViolations.stream().findFirst().get().getMessage()); } }}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 5种茶香5种等级,5种茶绝对不能喝
- macOS 下自定义 应用 app的语言
- 常练太极的人 身体绝对逆天
- 硬盘 几行命令清除移动硬盘GPT保护分区亲测绝对有效
- 小程序自定义动态Tabbar导航栏
- Ingress-nginx自定义配置文件
- 喝茶有5种饮食禁忌,5种茶绝对不能喝
- 利用AOP自定义Redis缓存注解
- 喝茶绝对不能不讲究,喝茶早晚有讲究
- 绝对不要喝的八种茶,禁忌八种不能喝的茶