自定义注解!绝对是程序员装X的利器( 三 )

以上切面中 , 有几个点需要大家注意的:

  • 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());        }    }}


推荐阅读