微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在库中创建 SessionFactory 时无法识别 NodeEntity

如何解决在库中创建 SessionFactory 时无法识别 NodeEntity

我不确定我的问题是否是不存在的功能,或者我是否错误地使用了 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 对象持久化 SessionSession 已正确创建,但无法识别传递的包中的 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 举报,一经查实,本站将立刻删除。