- 前言
- 问题阐述
- 探索之路
- 问题暂时解决
- 根本问题
- 问题解决
- 总结
最近在看一个小项目,出现了一个很奇怪的小问题,但是就是这个小问题,导致push到服务器后,出现了重大错误,这个小问题导致程序无法扫描到相应的entity,导致初始化失败,最后整个程序都无法运行。最终搞了几天,终于在今天发现了问题所在,因此本文纪录一下心酸且头秃的过程。
问题阐述项目结构如下
java
-------com
-------------aaaa.bbbb
----------------------------entity
@Configuration
public class AutoMapperConfig {
@Bean
public AutoMapper autoMapper() {
return new AutoMapper(new String[] { "com.aaaa.bbbb.entity" }); //配置实体类所在目录(可多个,暂时不支持通过符*号配置)
}
}
在接收项目的时候,为了方便,因此直接在桌面直接使用Git GUI Here,使用git clone的命令将这个项目clone下来。但是运行的时候爆了一大串错误。
巴拉巴拉一大串,意思就是说没找到entity这个文件,导致无法加载该文件里面的Java文件,因此mapping失败。所以关键问题在于Java没有找到entity文件。
探索之路因为Java后台说他没有找到该目录,而com.aaaa.bbbb.entity是相对路径的写法,所以我就在想是不是idea的配置问题,所以在目录的代码文件和测试文件分别标记
然后再在file structure的modules标记sources和tests。一顿操作猛如虎,一按run,不好意思还是一样的错。
然后我又找到,可能是缓存的原因,听说只要按下一个神奇的按钮,神龙就会满足你的愿望。
然后idea关闭,然后重新加载一堆东西…然后,还是报错。。。
俗话说的好,事不过三,然后我又发现了第三种方法,可能还是配置的问题。
在working directory填写上自己的文件目录。
然鹅,还是报错。。。。
在不断的测试中发现
java.com.aaaa.bbbb.entity aaaa.bbbb.entity bbbb.entity entity
都可以成功初始化,就是com.aaaa.bbbb.entity不可以!!!离谱!可恶啊!
虽然可以push上去的时候改回com.aaaa.bbbb.entity,但是这样子太耻辱了。
俗话说的好,欲练神功必先,emmm,练好内功。
为了找出原因,我选择用debug一步步探究。
@Configuration
public class AutoMapperConfig {
@Bean
public AutoMapper autoMapper() {
return new AutoMapper(new String[] { "com.aaaa.bbbb.entity" }); //配置实体类所在目录(可多个,暂时不支持通过符*号配置)
}
}
代码调用的是 AutoMapper函数
该函数出现于com.github.dreamyoung.mprelation
private String[] entityPackages;
public AutoMapper() {
this.entityPackages = new String[] {};
}
public AutoMapper(String[] entityPackages) {
this.entityPackages = entityPackages;
if (entityPackages != null && entityPackages.length > 0) {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
for (int i = 0; i < entityPackages.length; i++) {
String entityPackage = entityPackages[i];
String packagePath = entityPackage.replace(".", "/");
URL url = loader.getResource(packagePath);
if (url != null) {
String protocol = url.getProtocol();
if (protocol.equals("file")) {
File file = new File(url.getPath());
File[] files = file.listFiles();
for (File childFile : files) {
String fileName = childFile.getName();
if (fileName.endsWith(".class") && !fileName.contains("$")) {
String className = entityPackage + "." + fileName.substring(0, fileName.length() - 6);
autoMapperBean(className);
}
}
继续debug
发现在报错的情况下,虽然后端可以获取到com.aaaa.bbbb.entity并成功转化为com/aaaa/bbbb/entity但是无法获取到对应目录下的文件。简单来说,就像哈尔的移动城堡,虽然你打开了哈尔的门,但是里面是空的。就是说比如你想买奶茶,然后通过地图成功找到了奶茶店,但是奶茶店的工作人员都跑路了,啥都没,所以你肯定啥也拿不到。
然后再仔细观察url,发现url获得的一部分是一串乱码?
就是说,你可能真的到了人民路,但是人民路有可能是广州的、上海的、苏州的…找错地方了,那肯定拿不到。
为什么会出现这种情况呢?
可能是由于我的用户名是中文的(码农大忌)…而代码对中文还是不怎么友好,导致传着传着就变味了,解决方法很简单,把项目放在D盘就行了。
代码这东西真的是,失之毫厘,谬以千里。还得严格规范才行啊。解决了这个问题,我摸了摸有些凉凉的脑壳,长叹了一口气。/(ㄒoㄒ)/~~



