Spring Framework 类解析与最新的 neo4j-ogm-core/neo4j-ogm-bolt-driver

问题描述 投票:0回答:1

我正在使用

Java
Gradle
来编译和测试 我的项目。 运行
gradle -v
输出以下内容:

gradle -v

------------------------------------------------------------
Gradle 7.4.2
------------------------------------------------------------

Build time:   2022-03-31 15:25:29 UTC
Revision:     540473b8118064efcc264694cbcaa4b677f61041

Kotlin:       1.5.31
Groovy:       3.0.9
Ant:          Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM:          21.0.1 (Microsoft 21.0.1+12-LTS)
OS:           Linux 5.15.0-89-generic amd64

代码库在

Java 11
下工作,利用
build.gradle
文件中定义的以下库
Gradle

plugins {
    id 'org.springframework.boot' version '2.2.0.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
    id 'java-library'
}

group = 'pt.ist.meic'
version = '1.2.0'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {

    testImplementation(group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '2.2.2.RELEASE') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }

    testImplementation group: 'org.openjdk.jmh', name: 'jmh-generator-annprocess', version: '1.19'

    api group: 'org.openjdk.jmh', name: 'jmh-core', version: '1.19'
    api group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.10.0'
    api group: 'com.google.api-client', name: 'google-api-client', version: '1.30.9'

    implementation 'org.springframework.boot:spring-boot-starter-data-neo4j'
    implementation 'org.springframework.boot:spring-boot-starter-data-rest'
}

test {
    useJUnitPlatform()
}

最近我将几个依赖项更新到最新版本,并引发了似乎是弃用和兼容性问题。 这要求我还将

Java 17
设置为目标。 为了支持这个版本,我也更新了
Gradle

gradle -v

------------------------------------------------------------
Gradle 8.4
------------------------------------------------------------

Build time:   2023-10-04 20:52:13 UTC
Revision:     e9251e572c9bd1d01e503a0dfdf43aedaeecdc3f

Kotlin:       1.9.10
Groovy:       3.0.17
Ant:          Apache Ant(TM) version 1.10.13 compiled on January 4 2023
JVM:          21.0.1 (Microsoft 21.0.1+12-LTS)
OS:           Linux 5.15.0-89-generic amd64

这是我更新的

build.gradle
文件。 我不确定这是否 100% 正确,因为我必须尝试不同的方法才能编译它:

plugins {
    id 'org.springframework.boot' version '3.1.5'
    id 'io.spring.dependency-management' version '1.1.4'
    id 'java-library'
}

version = '1.2.0'
group = 'pt.ist.meic'
description = "PhyloDB Docker Container App"

java {
    sourceCompatibility = JavaVersion.VERSION_17
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(17))
    }
}

repositories {
    mavenCentral()
}

dependencies {

    implementation 'org.neo4j:neo4j-ogm-core:4.0.8'
    implementation 'org.neo4j:neo4j-ogm-bolt-driver:4.0.8'

    // https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api
    implementation group: 'jakarta.servlet', name: 'jakarta.servlet-api', version: '6.0.0'
    // https://mvnrepository.com/artifact/org.springframework/spring-core
    implementation group: 'org.springframework', name: 'spring-core', version: '6.1.0'
    // https://mvnrepository.com/artifact/org.springframework/spring-web
    implementation group: 'org.springframework', name: 'spring-web', version: '6.1.0'

    api group: 'org.openjdk.jmh', name: 'jmh-core', version: '1.37'
    api group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.16.0'
    api group: 'com.google.api-client', name: 'google-api-client', version: '2.2.0'

    implementation 'org.springframework.boot:spring-boot-starter-data-neo4j'
    implementation 'org.springframework.boot:spring-boot-starter-data-rest'
    implementation 'org.springframework.boot:spring-boot-starter-web'

    testImplementation group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
    testImplementation group: 'org.springframework', name: 'spring-core', version: '6.1.0'
    testImplementation group: 'org.springframework', name: 'spring-web', version: '6.1.0'
    // https://mvnrepository.com/artifact/org.springframework/spring-context
    testImplementation group: 'org.springframework', name: 'spring-context', version: '6.1.0'


    testImplementation(group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '3.1.5') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }


    testImplementation('org.junit.jupiter:junit-jupiter')
    testImplementation('org.neo4j:neo4j-ogm-core:4.0.8')
    testImplementation('org.neo4j:neo4j-ogm-bolt-driver:4.0.8')
    testImplementation group: 'org.openjdk.jmh', name: 'jmh-generator-annprocess', version: '1.37'

    
}

test {
    useJUnitPlatform()
}

编译似乎工作正常:

gradle bootJar

> Task :compileJava
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

BUILD SUCCESSFUL in 7s
4 actionable tasks: 4 executed

但是,当我尝试执行生成的 JAR 文件时,出现以下错误:

java -jar build/libs/phylodb-1.2.0.jar

18:51:24.545 [main] INFO  p.i.meic.phylodb.PhylodbApplication - Starting 
PhylodbApplication v1.2.0 using Java 21.0.1 with PID 198252 
(/home/user/phyloDB-official.git/phylodb/build/libs/phylodb-1.2.0.jar started 
by user in /home/user/phyloDB-official.git/phylodb)

18:51:24.547 [main] INFO  p.i.meic.phylodb.PhylodbApplication - 
No active profile set, falling back to 1 default profile: "default"

18:51:26.485 [main] INFO  o.a.catalina.core.StandardService - Starting service [Tomcat]
18:51:26.486 [main] INFO  o.a.catalina.core.StandardEngine - 
Starting Servlet engine: [Apache Tomcat/10.1.15]

18:51:26.575 [main] INFO  o.a.c.c.C.[Tomcat].[localhost].[/] 
- Initializing Spring embedded WebApplicationContext
18:51:26.654 [main] INFO  o.a.catalina.core.StandardService 
- Stopping service [Tomcat]
18:51:26.702 [main] ERROR o.s.boot.SpringApplication - 
Application run failed

org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'profileService' defined in URL 
[jar:file:/home/user/phyloDB-official.git/phylodb/build/libs/phylodb-1.2.0.jar!/BOOT-INF/classes!/pt/ist/meic/phylodb/typing/profile/ProfileService.class]: 
Unsatisfied dependency expressed through constructor parameter 0: 
Error creating bean with name 'datasetRepository' defined in URL 
[jar:file:/home/user/phyloDB-official.git/phylodb/build/libs/phylodb-1.2.0.jar!/BOOT-INF/classes!/pt/ist/meic/phylodb/typing/dataset/DatasetRepository.class]: 
Unsatisfied dependency expressed through constructor parameter 0: 

Error creating bean with name 'org.neo4j.ogm.session.Session': 
Failed to instantiate [org.neo4j.ogm.session.Session]: Specified class is an interface

特别是,以前版本的

Java
和依赖项没有出现以下错误:

Error creating bean with name 'org.neo4j.ogm.session.Session': 
Failed to instantiate [org.neo4j.ogm.session.Session]: Specified class is an interface

... (I omitted the remaining errors)

我正在尝试了解可能导致此问题出现的原因。 虽然

org.neo4j.ogm.session.Session
确实是
Java interface
,但这在过去是有效的,所以我相信 Spring 框架加载类的方式可能有问题。 我们正在使用诸如
@Repository
之类的注释,例如 在此文件中,这是错误的触发器之一

此链接中的

UserRepository
类有一个构造函数,该构造函数接收
org.neo4j.ogm.session.Session
的实例(实现)作为参数。 由于某种原因,在更新
Java
Gradle
和依赖项后,Spring 框架不再能够创建
org.neo4j.ogm.session.Session
的实例,尽管我不知道它在以前的版本中是如何做到的...

我通常使用

Maven
但这是在
Gradle
中完成的,所以我的目的是了解它是如何设计的。 我不确定这些软件包中的哪一个可能是导致头痛的原因:

implementation 'org.neo4j:neo4j-ogm-core:4.0.8'
implementation 'org.neo4j:neo4j-ogm-bolt-driver:4.0.8'
implementation group: 'org.springframework', name: 'spring-core', version: '6.1.0'
implementation group: 'org.springframework', name: 'spring-web', version: '6.1.0'
implementation 'org.springframework.boot:spring-boot-starter-data-neo4j'
implementation 'org.springframework.boot:spring-boot-starter-data-rest'
implementation 'org.springframework.boot:spring-boot-starter-web'

任何见解将不胜感激!

java gradle junit spring-data-neo4j neo4j-ogm
1个回答
0
投票

我发现的第一件事是,您从 Spring Boot 2.2 直接跳转到 3.1。而且,即使这听起来很刺耳,在这种情况下,可能最少的问题是 Java 17 基线。

重点关注 Spring Data Neo4j 和 Neo4j-OGM 依赖项: Spring Data Neo4j 在版本 5 和版本 6 之间发生了重大变化(发生在 Spring Boot 2.4 中)。

此更改从 Spring Data Neo4j 中删除了所有 Neo4j-OGM 依赖项,更重要的是,SDN 被完全重写并且现在拥有自己的对象映射。

话虽如此,我不确定到底是什么导致了您所面临的异常。新版本中 SDN 的 Spring Boot 自动配置不知道任何 Neo4j-OGM 类,也不会触及它。 也许这并不重要,让我们解决您的问题。

您有两个选择: 要么升级到新的 Spring Data Neo4j 堆栈,要么坚持使用旧的 Spring Data Neo4j 和 Neo4j-OGM 的“经典”组合。

第一个需要根据您当前的项目进行一些工作。 Spring Data Neo4j 不再支持 Neo4j-OGM 的某些功能,例如以工作关系为中心。结果映射更加严格。 如果您愿意走这条路,这里有一个样板迁移指南:https://docs.spring.io/spring-data/neo4j/reference/appendix/migration.html (因为它会完全使该线程爆炸,https://community.neo4j.com/c/drivers-stacks/spring-data-neo4j-ogm/30将是在迁移期间询问项目特定问题的最佳位置).

另一个选项,坚持使用 Neo4j-OGM/SDN 组合,由 https://github.com/neo4j/neo4j-ogm-spring 支持,这是初始 Spring Data Neo4j 5 的一个分支,与Neo4j-OGM Spring Boot 的最新版本。有关如何使用自定义启动器的信息,请参阅自述文件。另请记住,该项目并不总是与最新版本保持同步,而是尽最大努力进行维护。

© www.soinside.com 2019 - 2024. All rights reserved.