OS后端源码的一些扩展点说明



  • 代码的扩展性遵循OCP原则,扩展工作对原有代码具有尽量少的污染和侵入。
    以下文字说明 仅仅是为扩展工作做一些指导性的说明,具体请根据<样例参照>一栏 参照源码中已实现的例子。

    一、分页组件框架,第三方基础组件使用的是Mybatis的Plugin-PageHelper

    • 核心组件
      1.PageControllerService.java - 放置在Controller方法上的分页注释,用于为方法提供分页功能,以及匹配前端传来的分页排序参数和设置默认值;
      2.PageInterceptor.java - 自定义SpringMvc拦截器,主要的功能是 如果配置了PageControllerService注释,就为其提供分页功能;

    • 使用方式
      1.在需要有分页以及排序功能的Controller方法上配置PageControllerService注释;
      2.在dao层编写分页方法,并且返回类型设置为com.github.pagehelper.Page<T>;
      3.在mapper.xml文件中编写基本的查询逻辑(无需有分页和排序)即可;

    • 样例参照:com.videojj.videoportal.controller.CreativeController.queryCreativeByPage();

    二、SpringMvc端参数验证框架,主要利用SpringValidation组件搭建

    • 核心组件
      1.GlobalExceptionHandler.java - 全局异常捕获器,各类方式的参数验证失败的异常在此捕获,以及提示信息的拼接;
      2.ValidationMessages.properties - 异常未通过时的提示信息;

    • 目前主要提供的功能
      1.对controller方法的基本类型的提交的参数进行验证
      2.对controller方法的对象类型的json方式提交的参数进行验证
      3.在全局设置了文件未上传异常捕获器,但要用MultipartFile类型去接收
      4.对controller方法的对象类型的form方式提交的参数进行验证

    • 使用方式
      1.在需要验证的元素上增加JSR-303规范的注释;
      2.在需要验证顺序的BeanClass上标注@GroupSequence注释,并且设置具体顺序;
      3.在验证逻辑较为复杂的情况下,可以实现ConstraintValidator<A,B>,然后封装成自定义验证注释的方式;
      4.在controller中需要验证的Bean前添加@Validated注释,如果需要验证的是controller方法中基本类型 则在controller类上添加@Validated注释;

    • 样例参照:com.videojj.videoportal.controller.CreativeController;

    三、操作日志功能的扩展,主要由SpringAop技术实现;

    • 核心组件
      1.OperationLogAspect.java - 操作日志切面,操作日志的主处理逻辑;
      2.OperationLogAnnotationService.java - 标注在需要被记录操作日志的方法上的注释;
      3.OperationLogTypeEnum.java - 需要被扩展的操作日志类型;

    • 使用方式
      1.在OperationLogTypeEnum.java中添加新操作日志类型,不同类型建议用序号 并在不同大类间预留20条;
      2.如果需要收集的操作日志信息在方法入参就含有,则在方法头部添加@OperationLogAnnotationService注释,descArgPositions指需要收集的方法入参位置(数值0起始),fieldNames指 如果方法入参是对象 则可以用此属性指定属性名称,支持对象的导航功能,比如"attr1.attr2";
      3.如果需要收集的操作日志信息在方法体,可以按照此步骤收集:①OperationLogService.java定义方法 ②OperationLogServiceImpl.java中实现此方法,并做第2步的操作 ③在方法体中调用此方法即可;

    • 样例参照:com.videojj.videoservice.service.impl.CreativeServiceImpl.updateInfo()、com.videojj.videoservice.service.impl.CreativeServiceImpl.deleteCreativeByCreativeId()、com.videojj.videoservice.service.impl.CreativeServiceImpl.InteractionTypeServiceImpl.addInteractionInfo() 三种方式;