【问题标题】:springboot data rest not working with super class @MappedSuperclass春季启动数据休息不适用于超类@MappedSuperclass
【发布时间】:2016-08-13 17:08:31
【问题描述】:

已解决:伙计们,正如@HatemJaber 所说,我只是将版本 = 0 添加到我的预加载中,现在一切正常。版本列不能包含空值

所以我用 springboot 数据休息做了一些测试,一切正常,直到我像这样定义我的实体类:

超类:

@MappedSuperclass
public abstract class BaseEntity implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    // getters and setters and others @PrePersit @PreUpdate
}

英雄:

@Entity
public class Hero extends BaseEntity {
    // more boilerplate code ...
}

查找方法工作正常:

{
   _embedded: {
      heroes: [
        {
            createAt: "2016-08-13T16:57:22.099+0000",
            updateAt: null,
            name: "Spiderman",
            firstName: "Peter",
            lastName: "Parker",
            birthday: "1980-01-01T15:00:00.000+0000",
   _links: {
           self: {
           href: "http://localhost:8080/rest/heroes/1"
         },
        hero: {
           href: "http://localhost:8080/rest/heroes/1"
         }
    }
} 

通过 id 获取返回空页面

http://localhost:8080/rest/heroes/1

并抛出 NullPointerException

java.lang.NullPointerException: null
at org.springframework.data.rest.webmvc.support.ETag.getVersionInformation(ETag.java:192) ~[spring-data-rest-webmvc-2.5.2.RELEASE.jar:na]
at org.springframework.data.rest.webmvc.support.ETag.from(ETag.java:76) ~[spring-data-rest-webmvc-2.5.2.RELEASE.jar:na]
at org.springframework.data.rest.webmvc.HttpHeadersPreparer.prepareHeaders(HttpHeadersPreparer.java:64) ~[spring-data-rest-webmvc-2.5.2.RELEASE.jar:na]
at org.springframework.data.rest.webmvc.RepositoryEntityController.getItemResource(RepositoryEntityController.java:352) ~[spring-data-rest-webmvc-2.5.2.RELEASE.jar:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_102]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_102]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_102]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_102]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) ~[spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114) ~[spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) ~[spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) [spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) [tomcat-embed-core-8.5.4.jar:8.5.4]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) [spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) [tomcat-embed-core-8.5.4.jar:8.5.4]enter code here

这是一个错误还是我做错了什么?

PS:为了清楚起见,如果我不使用超类,一切正常

【问题讨论】:

  • NPE 抱怨@Version 列。您是否明确定义了一个?
  • 是的,我有一个@Version Integer 版本;我的 BaseEntity 上的列。另外我在 db create table HERO { ... version integer ... } 上有列
  • 经过新的测试,我很确定这个问题。如果您使用@Version 整数版本;在超类 (BaseEntity) 甚至在 Hero 上,你会得到 NullPointerException。
  • 我现在也看到了同样的情况。您的问题是谷歌的第一个结果。
  • 伙计们,正如@HatemJaber 所说,我只是在我的预加载中添加了版本= 0,现在一切正常。版本列不能包含空值。

标签: spring-boot spring-data-jpa spring-data-rest


【解决方案1】:

我要试一试,说您可能使用了 data-sql 文件来加载数据库并且您没有包含 version 字段?

这是我的问题,我进行了查找和替换,将 version 和一个值添加到我正在预加载的测试数据的插入语句中,并且一切都按预期工作。

【讨论】:

  • 我测试了你所说的并且效果很好。数据库上的版本不能为空。谢谢你
【解决方案2】:

看起来 spring-data-rest 不能很好地与使用 @Version 注释的实体一起工作,或者我缺少一些额外的配置。

看起来像一个错误。

【讨论】:

  • 是的,在你的帮助下 :) 我将所有版本 eq 的记录更新为 null 到 0。
猜你喜欢
  • 2013-03-23
  • 2016-01-30
  • 2021-07-14
  • 1970-01-01
  • 2015-06-30
  • 2019-06-30
  • 2017-03-07
  • 2020-05-17
相关资源
最近更新 更多