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 中使用这些库是有意义的。
为了在 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.
现在回到您面临的最初问题。
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 中使用这些库是有意义的。