Spring Data Neo4j 5 - HttpMessageNotWritableException 访问资源端点时

Spring Data Neo4j 5 - HttpMessageNotWritableException when hitting resource endpoints

为了在 Scala 中重新创建 Spring Data Neo4j official Movies example,我 运行 遇到了在 Spring Data Neo4j 层上进行 jsonifying 的问题。

详情请见本example project中的README

启动 Spring 应用程序并点击 /movies/<id> 会得到以下堆栈跟踪:

018-03-27 15:33:23 WARN DefaultHandlerExceptionResolver:442 - Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Invalid Object Id definition for movies.Movie: cannot find property with name 'id'; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Invalid Object Id definition for movies.Movie: cannot find property with name 'id' (through reference chain: org.springframework.hateoas.PagedResources["_embedded"]->java.util.Collections$UnmodifiableMap["movies"]->java.util.ArrayList[0])

我开了官方SpringData Neo4j JIRA问题here.

编辑: 在最近的评论之后,我从这个 post 中删除了关于根本原因的无关理论。我更新了示例项目以使用 PostConstruct 方法公开 Spring Data Rest 层上的 ID(感谢@meistermeier)。我也尝试了 RepositoryRestConfigurerAdapter 方法。然而,原来的 HttpMessageNotWritableException 仍然存在。有什么想法吗?

更新:SDN-University example 之后建模 Movie.scala,我尝试使用 com.voodoodyne.jackson.jsog.JSOGGenerator 作为对象 ID 生成器。我可以成功点击 /movies/ 但唯一的键是 "id",它只是一个索引,而不是实际的 ID。但是,有 38 部电影 return,电影数据集中的数量。我认为这会将问题缩小到 jsonfying 部分。

更新二: 通过使用创可贴在控制器中手动形成 json(使用 object-to-map 函数和 map-to-json 函数),我终于能够通过端点发送数据。我已经更新了示例项目来演示这一点。我可以成功地从 movieRepository 中检索对象,并随心所欲地操作它们。我认为这显然已将问题缩小到 jsonification。有没有人有关于如何用 JsonIdentifyInfo 正确注释 NodeEntity 的明确示例(Java 或 Scala)?

首先注意 id 作为 String 部分:内部 Neo4j id 必须是 Long 类型(此处信息部分之间的段落:https://neo4j.com/docs/ogm-manual/current/reference/#reference:annotating-entities:entity-identifier)。使用 Long 以外的其他类型,Neo4j OGM 无法在您的 class.

上找到所谓的本机 ID 字段

现在回到您面临的最初问题。 Spring Data Rest 抑制了 id-like 字段的暴露,Spring Data Neo4j 将 mark/register 带有 @Id 注释的字段。 要使用此 id 字段,您可以执行以下操作:

public class SpringBootApplication {
  private final RepositoryRestConfiguration configuration;

  public SpringBootApplication(RepositoryRestConfiguration configuration) {
    this.configuration=configuration;
  }

  @PostConstruct
  public void configuration() {
    configuration.exposeIdsFor(Person.class);
  }

我知道这是Java,所以这更Scala-ish。

旁注:

  • 我们正在升级电影样本
  • 此问题与 class 加载错误
  • 完全无关

终于解决了一个多月的问题

您必须将 scala.beans.BeanProperty 添加到任何需要生成 getter 和 setter 的 vars

将其添加到我的 NodeEntity 属性以及 sessionFactory bean 和 transactionManager bean 中,我所有的问题都神奇地消失了。

记录这个需要注释以在 Scala 中使用这些库是有意义的。