试图重新创建Scala中的Spring Data NEO4J官方电影示例,我已经遇到了弹簧数据NEO4J层的问题。
在此示例项目中的README
中注明了详细信息。
启动弹簧应用程序并击中/movies/<id>
给出以下堆栈:
018-03-27 15:33:23警告DefaulthandlerexceptionResolver:442-失败 写http消息: org.springframework.http.converter.httpmessagenotwratible exception: 无法写JSON:MOVIES.MOVIE的无效对象ID定义: 找不到名称为" ID"的属性;嵌套异常是 com.fasterxml.jackson.databind.jsonmappingexception:无效对象ID 电影的定义。情报:找不到具有名称'id'的属性 (通过参考链: org.springframework.hateoas.pageDresources [" _嵌入"]
我在这里打开了官方的弹簧数据Neo4J Jira问题。
编辑:在最新评论之后,我从这篇文章中删除了有关根本原因的无关理论。我已经更新了示例项目,以使用PostConstruct
方法(感谢@MeisterMeier(在Spring Data Rest
层上公开ID。我还尝试了RepositoryRestConfigurerAdapter
方法。但是,原始的HttpMessageNotWritableException
持续存在。有什么想法吗?
更新:在SDN-University示例之后对Movie.scala
进行建模,我尝试使用com.voodoodyne.jackson.jsog.JSOGGenerator
作为对象ID生成器。我可以成功击中/movies/
,但唯一的关键是" ID",它只是一个索引,而不是实际ID。但是,确实有38部电影返回,这是电影数据集中的数量。我认为这将问题缩小到了jsonfying的部分。
更新2:通过使用创可贴在控制器中手动形成json
(使用object-to-map
函数和map-to-json
函数(,我最终能够通过端点发送数据。我已经更新了示例项目以证明这一点。我可以从movieRepository
中成功检索对象,并随意操纵它们。我认为这显然将问题范围缩小到了jsonification。有人有一个明确的示例(Java或Scala(,如何使用JsonIdentifyInfo
正确注释NodeEntity
?
首先在ID上的注释AS String
部分:内部NEO4J ID必须为类型Long
(此处的信息部分之间的段落:https://neo4j.com/docs/ogm - 手动/当前/参考/参考:注释原理:实体 - 身份证(。与Long
相比,其他类型Neo4J OGM无法在您的课堂上找到所谓的本机ID字段。
现在回到您面临的最初问题。春季数据休息会抑制ID状字段的暴露,而弹簧数据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。
旁注:
- 我们目前正在升级电影样本
- 此问题与类加载错误完全无关
最后,一个多月后,我解决了问题。
您必须将scala.beans.BeanProperty
添加到需要生成的Getters和Setter的任何vars
。
将其添加到我的NodeEntity
属性以及sessionFactory
BEAN和transactionManager
BEAN中,而我所有的问题都神奇地消失了。
记录此所需的注释是有意义的在Scala中使用这些库。