2016-12-26 7 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); 

私は、次のbuild.gradleにEclipseを使用しています:今

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; 
    } 
} 

表は複合主キーを使用するため、次のものを使用しなければなりませんでしたhttp://docs.spring.io/spring-data/cassandra/docs/1.0.2.RELEASE/reference/html/cassandra.core.html

だから私のActivityKeyクラスは、次のとおりです:

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

}

最後にリポジトリがこれです:

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

} 

私のコントローラはこれです、ここで述べたようにtructure

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です:フィールドをautowireできませんでした: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フィールドで問題が発生する可能性があります。テストのためにStringに変更することができます。 –

+0

変更なし、同じエラーprevial​​s/ – arshellium

答えて

0

問題は、 'アクティビティ'テーブルの 'ts'列を表す 'タイムスタンプ'タイプのようです。私はそれをjava.utilから 'Date'に変更しました。すべてが正常に動作するようです。

私はまだその理由を調べる時間がありませんでした。

関連する問題