Spring boot Spring数据Cassandra Rest Id必须可分配给Serializable!:无效的

Spring boot Spring数据Cassandra Rest Id必须可分配给Serializable!:无效的,spring-boot,spring-data,spring-data-rest,spring-data-cassandra,Spring Boot,Spring Data,Spring Data Rest,Spring Data Cassandra,给定以下实体和存储库,我得到的Id必须可分配给Serializable!:访问存储库的rest资源时出现null错误 curl -H 'Accept: application/json' http://localhost:8080/properties {"cause":null,"message":"Id must be assignable to Serializable!: null"} 版本: 弹簧靴:2.0.1.释放 使用spring boot starter数据cassandra、s

给定以下实体和存储库,我得到的
Id必须可分配给Serializable!:访问存储库的rest资源时出现null
错误

curl -H 'Accept: application/json' http://localhost:8080/properties {"cause":null,"message":"Id must be assignable to Serializable!: null"} 版本:
弹簧靴:2.0.1.释放
使用spring boot starter数据cassandra、spring boot starter数据rest模块

异常堆栈跟踪:

java.lang.IllegalArgumentException: Id must be assignable to Serializable!: null at org.springframework.util.Assert.instanceCheckFailed(Assert.java:637) at org.springframework.util.Assert.isInstanceOf(Assert.java:537) at org.springframework.data.rest.webmvc.support.RepositoryEntityLinks.linkToSingleResource(RepositoryEntityLinks.java:135) at org.springframework.data.rest.core.support.DefaultSelfLinkProvider.createSelfLinkFor(DefaultSelfLinkProvider.java:68) at org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler.getSelfLinkFor(PersistentEntityResourceAssembler.java:99) at org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler.wrap(PersistentEntityResourceAssembler.java:76) at org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler.toResource(PersistentEntityResourceAssembler.java:55) at org.springframework.data.rest.webmvc.AbstractRepositoryRestController.entitiesToResources(AbstractRepositoryRestController.java:110) at org.springframework.data.rest.webmvc.AbstractRepositoryRestController.toResources(AbstractRepositoryRestController.java:80) at org.springframework.data.rest.webmvc.RepositoryEntityController.getCollectionResource(RepositoryEntityController.java:209) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866) at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) java.lang.IllegalArgumentException:Id必须可分配给Serializable!:无效的 位于org.springframework.util.Assert.instanceCheckFailed(Assert.java:637) 位于org.springframework.util.Assert.isInstanceOf(Assert.java:537) 位于org.springframework.data.rest.webmvc.support.RepositoryEntityLinks.linkToSingleResource(RepositoryEntityLinks.java:135) 位于org.springframework.data.rest.core.support.DefaultSelfLinkProvider.createSelfLinkFor(DefaultSelfLinkProvider.java:68) 位于org.springframework.data.rest.webmvc.persistentyresourceassembler.getSelfLinkFor(persistentyresourceassembler.java:99) 位于org.springframework.data.rest.webmvc.PersistentEntityResourcesEmbler.wrap(peristentEntityResourcesEmbler.java:76) 位于org.springframework.data.rest.webmvc.PersistentEntityResourcesEmbler.toResource(PersistentEntityResourcesEmbler.java:55) 位于org.springframework.data.rest.webmvc.AbstractRepositoryRestController.EntityStoreResources(AbstractRepositoryRestController.java:110) 位于org.springframework.data.rest.webmvc.AbstractRepositoryRestController.toResources(AbstractRepositoryRestController.java:80) 位于org.springframework.data.rest.webmvc.RepositoryEntityController.getCollectionResource(RepositoryEntityController.java:209) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:498) 位于org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209) 位于org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) 位于org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) 位于org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877) 位于org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783) 位于org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) 位于org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) 位于org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) 位于org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) 位于org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866) 位于javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 位于org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) 位于javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) 位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 位于org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 位于org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) 解决了问题。
如果一个实体类有一个复合键,那么只有当我有一个主键列专用类时,SpringDataREST才会工作。
将类结构更改为下面,为spring数据实体启用了rest资源。我使用嵌套的静态类作为键。但它很可能是自己的一个公共类

我觉得这个锅炉板应该从开发人员那里移除,而spring可以查看分区键列并将其用作Id

@Component
interface PropertyRepository extends CassandraRepository<Property, Property.PropertyKey> {
}

@Table("property_v1")
@Canonical
class Property {
    @PrimaryKey
    PropertyKey key
    @Column("value")
    String value

    @PrimaryKeyClass
    @Canonical
    static class PropertyKey implements Serializable {
        @PrimaryKeyColumn(value = "name", type = PARTITIONED)
        String name
        @PrimaryKeyColumn(value = "environment", type = CLUSTERED)
        String environment
    }
}
@组件
接口属性repository扩展了CassandraRepository{
}
@表(“物业单位v1”)
@规范的
类属性{
@主键
属性键
@列(“值”)
字符串值
@PrimaryKeyClass
@规范的
静态类PropertyKey实现可序列化{
@PrimaryKeyColumn(value=“name”,type=PARTITIONED)
字符串名
@PrimaryKeyColumn(value=“environment”,type=CLUSTERED)
字符串环境
}
}

你能提供你得到的堆栈跟踪吗?@OliverDrotbohm用异常跟踪更新了帖子 java.lang.IllegalArgumentException: Id must be assignable to Serializable!: null at org.springframework.util.Assert.instanceCheckFailed(Assert.java:637) at org.springframework.util.Assert.isInstanceOf(Assert.java:537) at org.springframework.data.rest.webmvc.support.RepositoryEntityLinks.linkToSingleResource(RepositoryEntityLinks.java:135) at org.springframework.data.rest.core.support.DefaultSelfLinkProvider.createSelfLinkFor(DefaultSelfLinkProvider.java:68) at org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler.getSelfLinkFor(PersistentEntityResourceAssembler.java:99) at org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler.wrap(PersistentEntityResourceAssembler.java:76) at org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler.toResource(PersistentEntityResourceAssembler.java:55) at org.springframework.data.rest.webmvc.AbstractRepositoryRestController.entitiesToResources(AbstractRepositoryRestController.java:110) at org.springframework.data.rest.webmvc.AbstractRepositoryRestController.toResources(AbstractRepositoryRestController.java:80) at org.springframework.data.rest.webmvc.RepositoryEntityController.getCollectionResource(RepositoryEntityController.java:209) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866) at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
@Component
interface PropertyRepository extends CassandraRepository<Property, Property.PropertyKey> {
}

@Table("property_v1")
@Canonical
class Property {
    @PrimaryKey
    PropertyKey key
    @Column("value")
    String value

    @PrimaryKeyClass
    @Canonical
    static class PropertyKey implements Serializable {
        @PrimaryKeyColumn(value = "name", type = PARTITIONED)
        String name
        @PrimaryKeyColumn(value = "environment", type = CLUSTERED)
        String environment
    }
}