2016-12-26 69 views
0

我有一個卡桑德拉集羣使用創建以下:複合卡桑德拉主要在春季啓動應用

CREATE KEYSPACE IF NOT EXISTS activitylogs WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'} AND durable_writes = true; 

CREATE TABLE IF NOT EXISTS activitylogs.activities (
     activity_id timeuuid, 
     actor_id text, 
     app_id text, 
     item_id text, 
     viewer_id text, 
     activity_type int, 
     ts timestamp, 
     PRIMARY KEY (actor_id, activity_id, app_id) 
    ) WITH CLUSTERING ORDER BY (activity_id DESC, app_id ASC); 

INSERT INTO activities (activity_id,actor_id, app_id, item_id, viewer_id, activity_type) VALUES (now(), 'fsdgs346-sdsd5-4242','blossom','ff235-fsd54-fadsfdfs45','hj923hjn-2jnkl23-323yfh',0); 

我使用Eclipse具有以下的build.gradle:

group 'com.abc' 
version '1.0-SNAPSHOT' 

apply plugin: 'java' 
apply plugin: 'eclipse' 
apply plugin: 'idea' 
apply plugin: 'spring-boot' 

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.5.RELEASE") 
    } 
} 

jar { 
    baseName = 'gs-serving-web-content' 
    version = '0.1.0' 
} 

repositories { 
    mavenCentral() 
} 


sourceCompatibility = 1.8 

repositories { 
    mavenCentral() 
} 


dependencies { 
    compile "org.springframework.boot:spring-boot-starter-web" 
    compile "org.springframework.data:spring-data-cassandra:1.4.6.RELEASE" 
    compile 'org.slf4j:slf4j-api:1.6.6' 
    compile 'ch.qos.logback:logback-classic:1.0.13' 
    testCompile "junit:junit" 
} 

task wrapper(type: Wrapper) { 
    gradleVersion = '2.3' 
} 

現在,我寫的以下實體:

package com.abc.activitystream.entity; 

import org.springframework.data.cassandra.mapping.Column; 
import org.springframework.data.cassandra.mapping.PrimaryKey; 
import org.springframework.data.cassandra.mapping.Table; 

import java.security.Timestamp; 

@Table(value = "activities") 
public class Activity 
{ 

    /*CREATE TABLE IF NOT EXISTS activitylogs.activities (
    activity_id timeuuid, 
    actor_id text, 
    app_id text,   
    item_id text, 
    viewer_id text, 
    activity_type int, 
    ts timestamp, 
    PRIMARY KEY (actor_id, activity_id, app_id)) WITH CLUSTERING ORDER BY (activity_id DESC);*/ 

    @PrimaryKey 
    private ActivityKey ak; 

    @Column(value = "item_id") 
    private String item_id; 

    @Column(value = "viewer_id") 
    private String viewer_id; 

    @Column(value = "activity_type") 
    private int activity_type; 

    @Column(value = "ts") 
    private Timestamp ts; 

    public String getItem_id() { 
     return item_id; 
    } 

    public void setItem_id(String item_id) { 
     this.item_id = item_id; 
    } 

    public String getViewer_id() { 
     return viewer_id; 
    } 

    public void setViewer_id(String viewer_id) { 
     this.viewer_id = viewer_id; 
    } 

    public int getActivity_type() { 
     return activity_type; 
    } 

    public void setActivity_type(int activity_type) { 
     this.activity_type = activity_type; 
    } 

    public Timestamp getTs() { 
     return ts; 
    } 

    public void setTs(Timestamp ts) { 
     this.ts = ts; 
    } 

    public ActivityKey getAk() { 
     return ak; 
    } 

    public void setAk(ActivityKey ak) { 
     this.ak = ak; 
    } 
} 

由於該表使用複合主鍵,所以必須使用以下s tructure這裏提到:http://docs.spring.io/spring-data/cassandra/docs/1.0.2.RELEASE/reference/html/cassandra.core.html

所以我ActivityKey類是這樣的:

@PrimaryKeyClass 
public class ActivityKey implements Serializable { 

    @PrimaryKeyColumn(name = "actor_id",ordinal = 0,type = PrimaryKeyType.PARTITIONED) 
    private String actor_id; 

    @PrimaryKeyColumn(name="activity_id",ordinal = 1,type = PrimaryKeyType.CLUSTERED, ordering = Ordering.DESCENDING) 
    private UUID activity_id = UUIDs.timeBased(); 

    @PrimaryKeyColumn(name="app_id", ordinal = 2, type = PrimaryKeyType.CLUSTERED, ordering = Ordering.ASCENDING) 
    private String app_id; 

    public String getActor_id() { 
     return actor_id; 
    } 

    public void setActor_id(String actor_id) { 
     this.actor_id = actor_id; 
    } 

    public UUID getActivity_id() { 
     return activity_id; 
    } 

    public void setActivity_id(UUID activity_id) { 
     this.activity_id = activity_id; 
    } 

    public String getApp_id() { 
     return app_id; 
    } 

    public void setApp_id(String app_id) { 
     this.app_id = app_id; 
    } 

    @Override 
     public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((actor_id == null) ? 0 : actor_id.hashCode()); 
     result = prime * result + ((app_id == null) ? 0 : app_id.hashCode()); 
     return result; 
     } 

     @Override 
     public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     ActivityKey other = (ActivityKey) obj; 
     if (actor_id == null) { 
      if (other.actor_id != null) 
      return false; 
     } else if (!actor_id.equals(other.actor_id)) 
      return false; 
     if (app_id == null) { 
      if (other.app_id != null) 
      return false; 
     } else if (!app_id.equals(other.app_id)) 
      return false; 
     return true; 
     } 

} 

我的控制器是這樣的:

@RestController 
public class ActivityController { 

    @Autowired 
    private ActivityRepository activityRepository; 

    @RequestMapping(value = "/activity",method = RequestMethod.GET) 
    @ResponseBody 
    public List<Activity> activity() { 
     List<Activity> activities = new ArrayList<>(); 
     activityRepository.findAll().forEach(e->activities.add(e)); 
     return activities; 
    } 

}

最後庫是這樣的:

public interface ActivityRepository extends CassandraRepository<Activity> { 

    @Query("SELECT*FROM activities WHERE actor_id=?0 LIMIT ?1") 
    Iterable<Activity> findByActor_Id(String actor_id,Integer limit); 

} 

奇怪的是,應用程序不運行並退出時出現以下錯誤:

創建名爲'greetingController'的bean時出錯:注入自動裝配依賴項失敗;嵌套異常是org.springframework.beans.factory.BeanCreationException:無法自動裝入字段:private com.rg.cassandraspring.repository.ActivityRepository com.rg.cassandraspring.controller.GreetingController.activityRepository;嵌套異常是org.springframework.beans.factory.BeanCreationException:創建名爲'activityRepository'的bean時出錯:init方法的調用失敗;嵌套的例外是org.springframework.data.cassandra.mapping.VerifierMappingExceptions:java.security.cert.CertPath中: 卡桑德拉實體必須有@Table,@Persistent或@PrimaryKeyClass註釋

最後,這是我CassandraConfig:

@Configuration 
//@PropertySource(value = {"classpath:META-INF/cassandra.properties"}) 
@EnableCassandraRepositories(basePackages = {"com.abc"}) 
public class CassandraConfig { 

    @Autowired 
    private Environment environment; 

    private static final Logger LOGGER = LoggerFactory.getLogger(CassandraConfig.class); 

    @Bean 
    public CassandraClusterFactoryBean cluster() { 

     CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean(); 
     cluster.setContactPoints("localhost"); 
     cluster.setPort(Integer.parseInt("9042")); 
     return cluster; 
    } 

    @Bean 
    public CassandraMappingContext mappingContext() { 
     return new BasicCassandraMappingContext(); 
    } 

    @Bean 
    public CassandraConverter converter() { 
     return new MappingCassandraConverter(mappingContext()); 
    } 

    @Bean 
    public CassandraSessionFactoryBean session() throws Exception { 

     CassandraSessionFactoryBean session = new CassandraSessionFactoryBean(); 
     session.setCluster(cluster().getObject()); 
     session.setKeyspaceName("activitylogs"); 
     session.setConverter(converter()); 
     session.setSchemaAction(SchemaAction.NONE); 

     return session; 
    } 

    @Bean 
    public CassandraOperations cassandraTemplate() throws Exception { 
     return new CassandraTemplate(session().getObject()); 
    } 

} 

任何人都可以幫助我嗎?我似乎無法指出問題所在。

+0

值得注意的是,當我使用單場的PrimaryKey – arshellium

+0

^那麼它可能是問題與'UUID'場..你可以嘗試更改爲字符串進行測試.. –

+0

沒有變化,同樣的錯誤previal​​s/ – arshellium

回答

0

該問題似乎是'Timestamp'類型來表示表'activities'的'ts'列。我將其更改爲java.util中的Date,並且一切似乎都運行良好。

我還沒有時間查看原因。