JAVA动态增强一个BaseController的已经存在的接口
使用场景
前提场景
我们多个系统同时继承了某一个通用系统,通用系统的接口是不会允许随意改变的,其他子系统都依赖于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>
作者:隔壁老郭
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
Java入门到入坟
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!