1

为了在 Scala 中重新创建Spring Data Neo4j 官方电影示例,我在 Spring Data Neo4j 层上遇到了 jsonifying 的问题。

README示例项目中记录了详细信息。

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

018-03-27 15:33:23 WARN DefaultHandlerExceptionResolver:442 - 无法写入 HTTP 消息:org.springframework.http.converter.HttpMessageNotWritableException:无法写入 JSON:movies.Movie 的无效对象 ID 定义:找不到具有名称的属性'ID'; 嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException:movies.Movie 的无效对象 ID 定义:找不到名称为“id”的属性(通过参考链:org.springframework.hateoas.PagedResources["_embedded"]->java .util.Collections$UnmodifiableMap["movies"]->java.util.ArrayList[0])

我在这里打开了一个官方的 Spring Data Neo4j JIRA 问题

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

更新:在SDN-University 示例Movie.scala之后 建模,我尝试将其用作对象 ID 生成器。我可以成功命中,但唯一的关键是“id”,它只是一个索引,而不是实际的 id。但是,确实返回了 38 部电影,这是电影数据集中的数量。我认为这会将问题缩小到 jsonfying 部分。com.voodoodyne.jackson.jsog.JSOGGenerator/movies/

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

4

2 回答 2

1

首先是关于 id 作为String一部分的注释:内部 Neo4j id 必须是类型Long(此处信息部分之间的段落:https ://neo4j.com/docs/ogm-manual/current/reference/#reference:annotating-entities :实体标识符)。使用 Neo4j OGM 以外的另一种类型Long无法在您的班级中找到所谓的本机 id 字段。

现在回到您面临的最初问题。Spring Data Rest 抑制了类似 id 的字段的暴露,Spring Data Neo4j 将使用@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。

旁注:

  • 我们目前正在升级电影样本
  • 此问题与类加载错误完全无关
于 2018-03-30T08:16:00.557 回答
0

终于,一个多月后,我解决了这个问题。

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

将此添加到我的NodeEntity属性以及sessionFactorybean 和transactionManagerbean 上,我所有的问题都神奇地消失了。

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

于 2018-05-17T13:45:24.403 回答