[spring-projects/spring-boot]升级到 Neo4j Ogm 3.1.1

2024-04-23 482 views
1

我正在报告将项目从 Spring Boot 版本 2.0.3.RELEASE 升级到版本 2.0.4.RELEASE 时发生的错误。

我在项目中使用 Spring Data Neo4j 并包含spring-boot-starter-data-neo4j依赖项。从 Spring Boot 版本 2.0.4 开始,启动器似乎提供了 Spring Data Neo4j 版本 5.0.9.RELEASE。 Spring Data Neo4j的POM定义了要使用的Neo4j OGM版本3.0.4,请参见此处:https: //github.com/spring-projects/spring-data-neo4j/blob/5.0.9.RELEASE/pom.xml 但是Spring Boot 2.0.4的BOM定义了Neo4j OGM版本3.1.0,请参见这里:https: //github.com/spring-projects/spring-boot/blob/v2.0.4.RELEASE/spring-boot-project /spring-boot-dependencies/pom.xml

这里真正令人烦恼的问题是,这不仅是“正式”不匹配,而且我在这个新版本星座中遇到了奇怪的运行时错误。当使用像我这样的查询方法查询 Spring Data 存储库时,findByUserId(String userId)突然出现以下异常:

java.lang.ClassNotFoundException: org.neo4j.ogm.cypher.Filter$NestedPathSegment

调查问题我发现内部类NestedPathSegment存在于 Neo4j OGM 版本高达 3.0.4 中,请参见此处:https: //github.com/neo4j/neo4j-ogm/blob/v3.0.4/core/src/ main/java/org/neo4j/ogm/cypher/Filter.java 但后来它突然在由 Spring Boot 管理的 Neo4j OGM 版本 3.1.0 中消失了,请参见这里:https://github.com/neo4j/neo4j-ogm /blob/v3.1.0/core/src/main/java/org/neo4j/ogm/cypher/Filter.java

也许这就是 Spring Data Neo4j 项目迄今为止尚未迁移到该版本的原因。

我通过覆盖 Neo4j OGM 版本以强制使用 3.0.4 来解决该问题,以符合 Spring Data。我这样做gradle.properties

neo4j-ogm.version=3.0.4

我不确定您的地址中的问题是否正确,因为 Neo4j OGM 项目似乎与其实现不一致。

回答

1

@georgwittberger 在此之前我们已经升级到 Neo4j 3.1.0(实际上是在 2.0.0.RC2 中,请参阅#12145),所以看起来 Spring Data Neo4j 中可能发生了一些变化?

寻呼@michael-simons 寻求反馈。

8

@snicoll 感谢您这么快地调查这个问题,Stéphane。

我还假设 Spring Data Neo4j 版本 5.0.9 中存在一些更改,导致与 Neo4j OGM 版本 3.1.0 不兼容。

更准确地说,如何重现:当 Spring Data 生成的查询必须遍历对象图进行过滤时,就会出现问题。在我的例子中,我查询一组@RelationshipEntity对象,其中一个相关节点实体的属性用于过滤。像这样的图像:

@RelationshipEntity(type = "RELATED_TO")
class MyRelation {
  @Id
  String id;
  @StartNode
  MyStartNode startNode;
  @EndNode
  MyEndNode endNode;
  String customProperty;
}

@NodeEntity
class MyStartNode {
  @Id
  String id;
  @Relationship(type="RELATED_TO")
  MyRelation relatedTo;
}

@NodeEntity
class MyEndNode {
  @Id
  String id;
  @Relationship(type="RELATED_TO")
  MyRelation relatedTo;
}

@Repository
interface MyRelationRepository extends Neo4jRepository<MyRelation, String> {
  Iterable<MyRelation> findByStartNodeId(String startNodeId);
}
6

我们修复了派生查找器方法中嵌套属性的错误。为了至少保持向后兼容性,Neo4j OGM 在3.0.43.1.1-RC1中引入了额外的 API 。这些是 Spring Data Neo4j 5.0.95.1.0-RC1 (Lovelace)的版本。我们在这里违反了(API)合同,但不幸的是这是必要的,所以这绝对是我们的错。我建议暂时保留 Neo4j OGM 3.0.4。 @snicoll 作为一个可能的修复,我们可以在几周内发布稳定的3.1.1 。这可能会在下次升级中得到,或者?

9

感谢@meistermeier 的反馈 - 我们当然可以升级到3.1.1for2.0.52.1.0.M2。让我们重新调整这个问题的目的。

4

感谢@meistermeier 的插话和@snicoll 提出的解决方案。嵌套属性的修复将在 3.1.1 和 3.0.4 中进行,3.1.1 将与最新的 SDN Lovelace 一起发布。我想知道为什么OGM是单独管理的。是否适合想要使用 OGM 但不想使用 Spring Data 的 Spring Boot 用户?

@georgwittberger 目前,我们建议像您已经做的那样设置版本属性。带来不便敬请谅解。

4

@meistermeier 有关版本的任何更新吗3.1.1?我们将于周二发布,如果可能的话,希望修复此问题。

9

Neo4j-OGM3.1.1版本与 Spring Data Lovelace 版本系列紧密结合。周一是 Spring Data Lovelace RC2 计划,我们昨天刚刚发布了 RC2。

让我和 SD 团队讨论一下这个问题。我正在考虑在3.1.1本周末发布(最终版),因为它没有未解决/已知的问题。如果我们需要对 SDN Lovelace GA 的 OGM 进行任何更改,我们可以选择3.1.2.

旁注:2.0.5 不在日历中。以为我们会有更多时间。

编辑:因为这个问题而考虑本周末发布,而不是因为我想这样做?

1

@meistermeier 我们正在使用3.1.0发布Kay序列(因为这个问题影响 Spring Boot 2.0.x)。我们无法真正升级到 RC 以获得维护版本,这就是我问的原因。

如果3.1.x与 Kay 一起使用是错误的,也请告诉我(尽管我怀疑我们是否能够降级,除非您觉得这是严重错误的)。感谢您的支持!

2

这是你给 2.0.0 发布派对带来的根本问题;) Kay 本来只想与 Neo4j-OGM 3.0.x 一起工作,但我刚刚看到 SB 中有一个 Neo4j-OGM 版本定义,但为时已晚。所以目前我们3.1.x与Kay (for SB) 和Lovelace保持兼容。我也有一种强烈的感觉,认为版本不应该降级,否则我在第一条评论中就建议了这一点。

3.1.1如果没有人投票反对的话,让我在周末发布一个稳定的非 RC 版本。

9

从我这边为 3.1.1 +1。

4

结束有利于 PR #14132

4

我今天遇到这个问题,暂时迁移到3.1.1。新版本是否有任何更新来修复此问题?

2

Boot已经升级到3.1.1及更高版本。 IIRC,最新的 2.0.x 和 2.1.x 版本正在使用 3.1.5。

5

@DevanshModi Spring Boot 版本 2.0.5 解决了我的问题,并且我能够删除 OGM 版本覆盖。您能尝试一下那个版本的 Spring Boot(或更高版本)吗?