Spring data Cassandra Rest Id должен быть назначен на Serializable !: null - PullRequest
0 голосов
/ 03 апреля 2019

Приведенный ниже Entity и Repository, я получаю ошибку Id must be assignable to Serializable!: null при доступе к ресурсу rest для репозитория.

curl -H 'Accept: application/json' http://localhost:8080/properties
{"cause":null,"message":"Id must be assignable to Serializable!: null"}

Groovy код

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

@Table("property_v1")
@Canonical
class Property {
    @PrimaryKeyColumn(value = "name", type = PARTITIONED)
    String name
    @PrimaryKeyColumn(value = "environment", type = CLUSTERED)
    String environment
    @Column("value")
    String value
}

Я пытался добавить аннотацию @Id в поле первичного ключа, но Spring не допускает аннотации @Id и @PrimaryKeyColumn для одной и той же сущности.

Я получаю @Table types must not define both @Id and @PrimaryKeyColumn properties ошибку.

Как мне получить доступ к данным о пружинных сущностях Кассандры поверх остальных?

Я также пытался использовать аннотацию RepositoryRestResource для класса Repository, но получил ту же ошибку.

@RepositoryRestResource(path = "/properties", collectionResourceRel = "properties")

Версии:
Пружинная загрузка: 2.0.1.RELEASE
Используются модули пружины-загрузки-стартера-данных-кассанды, пружины-загрузки-стартера-данных-отдыха

Stacktrace:

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)

1 Ответ

0 голосов
/ 04 апреля 2019

Разобрался с проблемой.
Если у класса сущности есть составной ключ, остальные данные пружины работают , только если У меня есть выделенный класс для столбцов первичного ключа.
Изменив структуру классов ниже, включил ресурсы отдыха для объектов данных Spring. Я использовал вложенный статический класс для ключа. Но это вполне может быть собственный публичный класс.

Мне кажется, что эта плита котла должна быть снята с разработчиков, и вместо этого пружина может заглянуть в столбец ключа раздела и использовать его в качестве идентификатора.

@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
    }
}
...