遇到的问题:
今天在线上系统突然发现了一个bug,jeecg-boot项目在部门板块新增部门的时候,发现无法新增部门。以为是代码发版问题,就重发了一次版本,发现还是不行,本地却可以。然后以为是本地库与线上库数据不同步,然后连生产库,发现还是不行。
然后就一点点排查,最后就只能怀疑是传统打包方式的问题了。
可能的原因:
我看了一下部门新增规则,他是需要生成一个编码,用来给机构编码赋值。
类似如下:
代码如下:
@Slf4j
public class FillRuleUtil {
/**
* @param ruleCode ruleCode
* @return
*/
@SuppressWarnings("unchecked")
public static Object executeRule(String ruleCode, JSONObject formData) {
if (!StringUtils.isEmpty(ruleCode)) {
try {
// 获取 Service
ServiceImpl impl = (ServiceImpl) SpringContextUtils.getBean("sysFillRuleServiceImpl");
// 根据 ruleCode 查询出实体
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("rule_code", ruleCode);
JSONObject entity = JSON.parseObject(JSON.toJSONString(impl.getOne(queryWrapper)));
if (entity == null) {
log.warn("填值规则:" + ruleCode + " 不存在");
return null;
}
// 获取必要的参数
String ruleClass = entity.getString("ruleClass");
JSONObject params = entity.getJSONObject("ruleParams");
if (params == null) {
params = new JSONObject();
}
if (formData == null) {
formData = new JSONObject();
}
// 通过反射执行配置的类里的方法
IFillRuleHandler ruleHandler = (IFillRuleHandler) Class.forName(ruleClass).newInstance();
return ruleHandler.execute(params, formData);
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
}
代码解释(个人理解):
这段代码中,是通过反射来执行特定的填值规则。
首先,它检查传入的ruleCode是否为空。如果不为空,代码尝试从Spring上下文中获取名为sysFillRuleServiceImpl的服务实例,并使用这个服务来查询与ruleCode相匹配的规则实体。
获取到的规则实体中包含了要执行的类名ruleClass和参数params。
最后,通过反射创建ruleClass指定的类的实例,并调用其execute方法,传入参数执行特定逻辑。
这是一个动态根据规则代码执行不同逻辑的示例。
他查询的表在sysFillRuleServiceImpl中有指向:sys_fill_rule
表内容如下:
说白了:就是通过反射来找到对应的类或者资源来执行特定的逻辑
很好,咱们接着说
开始尝试修改
我原本是通过传统打包方式,也就是将依赖放在/lib目录下的jar包,外面一个主干jar包,然后启动jar包,需要指向依赖的目录,这样。
目的就是方便上线嘛~传输的包小,速度快
然后我修改为Fat JAR打包方式,也就是将所有依赖都打成一个包。然后发版。
成功!?
总结:
传统打包方式可能在处理类路径上有所不同,导致反射时可能找不到正确的类或资源。而Fat JAR将所有必需的依赖和资源都打包在一个JAR中,这样就保证了运行时类路径的一致性,使得反射相关的代码能够正常工作。这可能是!为什么切换到Fat JAR打包方式后你的问题得到了解决的原因了
但是!
我还是不懂,是哪里的问题,特!发布英雄帖,集思广益。
上述如有描述不对,还请海涵。