JAVA动态增强一个BaseController的已经存在的接口

发布时间 2023-09-25 16:31:54作者: 白嫖老郭

使用场景

前提场景

我们多个系统同时继承了某一个通用系统,通用系统的接口是不会允许随意改变的,其他子系统都依赖于Base系统的通用接口

目标需求场景

但是有一个业务,需要给某一个公共接口增加子系统独有的业务功能;比如某个接口完成之后会往其他的业务修改状态

解决方案

通常使用做法-01 集成BaseController的接口,从写这个业务代码,然后覆盖掉原有通用接口的业务

通常使用做法-02 spring的最重要的核心特性之一---AOP切面增强

推荐使用AOP技术增强。

实现代码 --使用返回通知


/**
 * 动态增强BaseController的接口代码
 */
@Aspect
@Component
public class NioTaskInfoControllerAdvice {

    Logger logger = LoggerFactory.getLogger(NioTaskInfoControllerAdvice.class.getSimpleName());

    private String msgStartSuffix = "申请号:";

    @Autowired
    private FeeInfoService feeInfoService;


    //标识切入点的特征
    @Pointcut(value = "execution(* com.XX.XX.XX.interfaces.XXXController.finish(..))")
    public void pointCut() {

    }


    /**
     * XX完成拓展--BB需要自动生成费用确认台账
     * 返回通知(@AfterReturning):当被增强的方法 成功执行之后调用通知
     */
    @AfterReturning(value = "pointCut()", returning = "result")
    public void afterReturning(JoinPoint joinPoint, Object result) {
        logger.info("XX完成接口增强---成功执行之后调用返回通知通知织入增强业务逻辑");
        try {
            if (result instanceof Result) {
                if (((Result<?>) result).isSuccess()) {
                    logger.info("回调状态---->XX已完成----->准备生成BB确认台账");
                } else {
                    logger.info("回调状态---->XX未完成....");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("XX完成---->BB确认自动生成台账织入失败....");
        }
    }
}

额外还发现一个BUG Mybatis的动态SQL的if标签对于Integer数据类型为0的判断

平时我们的判空代码直接是抄过来的

<if test="status!= null  and status!= ''">
  status=#{status},
</if>
  • 在这段代码中传入0,如果传入的0是String类型的话是不会有问题的
  • 但是如果传入的0是Integer类型的,Integer的0会被mybatis认为是空的字符

解决方案


<if test="status!= null>
  status=#{status},
</if>