问题描述
我不确定我的问题是否是不存在的功能,或者我是否错误地使用了 neo4j-ogm 框架。由于您只应该在项目 GitHub 存储库中发布错误或功能请求,因此我想先将我的问题放在此处。
请注意,我缩短了我的实际代码,只是为了让您了解我要实现的目标。
我的示例应用程序由两个模块组成: 模块 a 包含一个用于创建 neo4j-ogm 会话的类。在那里我从属性文件中读取配置并创建会话工厂,将包作为参数传递给扫描:
public Neo4jController(final String ... packagesWithNodes) {
ConfigurationSource props = new ClasspathConfigurationSource("neo4jogm.properties");
Configuration configuration = new Configuration.Builder(props).build();
SessionFactory sessionFactory = new SessionFactory(configuration,packagesWithNodes);
...
}
模块 b 包含 模块 a 作为 Maven 依赖项,然后尝试通过 NodeEntity
对象持久化 Session
。 Session
已正确创建,但无法识别传递的包中的 NodeEntity
。
public MyObject create(final MyObject newObject) {
Neo4jController neo4jController = new Neo4jController("my.example.package");
neo4jController.getNeo4jSession().save(newObject);
...
}
这总是导致 IllegalArgumentException
:
Class class my.example.package.MyObject is not a valid entity class. Please check the entity mapping.
这就是我在 module b 中的 NodeEntity
的样子
package my.example.package;
import de.bitandgo.workflow.common.model.Neo4jNode;
import org.neo4j.ogm.annotation.NodeEntity;
import org.neo4j.ogm.annotation.Property;
@NodeEntity(label = "MyObject")
public class MyObject extends Neo4jNode {
@Property
public String name;
}
基类包含其中
public abstract class Neo4jNode {
@Id
@GeneratedValue
private Long id;
}
我知道 neo4j-ogm 在内部使用 glassgraph 来扫描类路径。框架中带有前置配置的相应调用如下所示:
private static List<String> useClassgraph(String[] packagesOrClasses) {
// .enableExternalClasses() is not needed,as the super classes are loaded anywhere when the class is loaded.
try (ScanResult scanResult = new ClassGraph()
.ignoreClassVisibility()
.acceptPackages(packagesOrClasses)
.acceptClasses(packagesOrClasses)
.scan()) {
return scanResult.getAllClasses().getNames();
}
}
通过调试,我验证了所需的包 my.example.package
已作为参数传递给 GlassGraph
对象。
模块 a 中的 Neo4jController
也能够加载类。我已经使用以下代码对此进行了测试
try {
Class<?> aClass = Class.forName("my.example.package.MyObject");
System.out.println(aClass); // prints "class my.example.package.MyObject"
} catch (ClassNotFoundException e) {}
我的问题是 neo4j-ogm/classgraph 是否可能由于 neo4j-ogm 的方式根本无法找到类使用 classgraph,或者我在使用中做错了什么。
更新 1:
该问题似乎与我在应用程序服务器 (TomEE) 内运行的应用程序有关。当我部署我的应用程序时,ClassGraph 无法找到配置的包。
但是通过经典的 main
方法执行完全相同的扫描会找到预期的类。
public static void main(String[] args) {
try (ScanResult scanResult = new ClassGraph()
.ignoreClassVisibility()
.acceptPackages("my.example.package")
.acceptClasses()
.scan()) {
System.out.println(scanResult.getAllClasses().getNames());
}
}
所以我认为问题与将应用程序部署到应用程序服务器时在“正常”类路径中不可见的编译类有关?
我感谢任何输入。
非常感谢
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)