2013-09-05 29 views
1

時,我不斷收到消息收到錯誤的NoSuchMethodError:使用Apache Cassandra的,昆德拉,Spring MVC的

java.lang.NoSuchMethodError: org.apache.cassandra.thrift.TBinaryProtocol: method <init>(Lorg/apache/thrift/transport/TTransport;)V not found 
at com.impetus.client.cassandra.schemamanager.CassandraSchemaManager.initiateClient(CassandraSchemaManager.java:446) 
at com.impetus.kundera.configure.schema.api.AbstractSchemaManager.exportSchema(AbstractSchemaManager.java:101) 
at com.impetus.client.cassandra.schemamanager.CassandraSchemaManager.exportSchema(CassandraSchemaManager.java:138) 
at com.impetus.kundera.configure.SchemaConfiguration.configure(SchemaConfiguration.java:172) 
at com.impetus.kundera.configure.ClientMetadataBuilder.buildClientFactoryMetadata(ClientMetadataBuilder.java:45) 
at com.impetus.kundera.persistence.EntityManagerFactoryImpl.configureClientFactories(EntityManagerFactoryImpl.java:352) 
at com.impetus.kundera.persistence.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:116) 
at com.impetus.kundera.KunderaPersistence.createEntityManagerFactory(KunderaPersistence.java:83) 
at com.impetus.kundera.KunderaPersistence.createContainerEntityManagerFactory(KunderaPersistence.java:65) 

每當我嘗試運行我的Java Spring MVC的3.2項目org.apache.cassandra.thrift.TBinaryProtocol。我試圖使用Kundera從Spring WebApp連接到我的機器上安裝的Apache Cassandra 1.2.8。我已經包含在項目的pom.xml文件以下依賴性:

  1. scale7-貝洛布思(1.3-1.1.x)
  2. 卡桑德拉 - 所有&卡桑德拉 - clientutil(1.2.8)
  3. 昆德拉核&昆德拉 - 卡珊德拉(2.6)

我的春天項目採用XML-較少的配置(Java的配置)和JPA除了昆德拉的persistence.xml這是在(項目)/ src目錄/主/資源/ META -INF,以便在部署期間位於類路徑的基礎上。我的persistence.xml樣子:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
     http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
     version="2.0"> 
     <persistence-unit name="cassandra_pu"> 
      <provider>com.impetus.kundera.KunderaPersistence</provider> 
      <class>org.tutiworks.orm.Role</class> 
      <class>org.tutiworks.orm.User</class> 
      <properties>    
       <property name="kundera.nodes" value="localhost"/> 
       <property name="kundera.port" value="9160"/> 
       <property name="kundera.keyspace" value="afrikana"/> 
       <property name="kundera.dialect" value="cassandra"/> 
       <property name="kundera.ddl.auto.prepare" value="update"/> 
       <property name="kundera.client.lookup.class" value="com.impetus.client.cassandra.pelops.PelopsClientFactory" /> 
       <property name="kundera.cache.provider.class" value="com.impetus.kundera.cache.ehcache.EhCacheProvider"/> 
       <property name="kundera.cache.config.resource" value="/ehcache-cassandra.xml"/>     
      </properties>  
     </persistence-unit> 
    </persistence> 

,配置類創建EntityManager的樣子:

  @Configuration 
    public class SpringDataConfig extends WebMvcConfigurerAdapter{ 

     @Autowired 
     private Environment env; 

     @Value("${kundera.nodes}") private String node; 
     @Value("${kundera.port}") private String port; 
     @Value("${kundera.keyspace}") private String keyspace; 
     @Value("${kundera.dialect}") private String dialect; 
     @Value("${kundera.ddl.auto.prepare}") private String dbGenerator; 
     @Value("${kundera.cache.provider.class}") private String cacheClass; 
     @Value("${kundera.client.lookup.class}") private String lookupClass; 
     @Value("${kundera.cache.config.resource}") private String configResource; 
     @Value("${persistence.unit.name}") private String persistenceUnitName; 

     @Bean 
     public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
      LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
      em.setPersistenceUnitName(persistenceUnitName); 
      return em; 
     } 

     @Bean 
     public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { 
      return new PersistenceExceptionTranslationPostProcessor(); 
     } 
    } 

以下類展示了持久化上下文是如何使用的。

 public abstract class GenericDAO< T extends Serializable > { 

      private Class<T> clazz; 

      @PersistenceContext 
      EntityManager entityManager; 

      protected void setClazz(Class<T> clazzToSet){ 
       this.clazz = clazzToSet; 
      } 

      public T findOne(String id){ 
       return this.entityManager.find(this.clazz, id); 
      } 

      @SuppressWarnings("unchecked") 
      public List<T> findAll(){ 
       return this.entityManager.createQuery("from " + this.clazz.getName()) 
       .getResultList(); 
      } 

      public void save(T entity){ 
       this.entityManager.persist(entity); 
      } 

      public void update(T entity){ 
       this.entityManager.merge(entity); 
      } 

      public void delete(T entity){ 
       this.entityManager.remove(entity); 
      } 
      public void deleteById(String entityId){ 
       T entity = this.findOne(entityId); 

       this.delete(entity); 
      } 
     } 

在Apache Cassandra安裝中映射到列族的ORM示例如下所示。

 @XmlRootElement(name = "Role") 
    @Entity(name="Role") 
    @Table(name = "roles", schema = "[email protected]_pu") 
    public class Role implements Serializable { 

     private static final long serialVersionUID = 9127322651789683331L; 

     @Id 
     @Column(name="id") 
     @XmlID 
     private String id; 

     @Column(name = "role_name") 
     @XmlElement(name = "role_name") 
     private String roleName; 

     public String getRoleName() { 
      return roleName; 
     } 

     public void setRoleName(String roleName) { 
      this.roleName = roleName; 
     } 

     public String getId() { 
      return id; 
     } 

     public void setId(String id) { 
      this.id = id; 
     } 
    } 

我會在哪裏配錯我的配置?我錯過了什麼?我該如何解決這個錯誤?

回答

0

昆德拉cassandra庫在1.2.4版本上運行。理想情況下,1.2.8或更高版本應始終向後兼容,但在這種情況下,不幸的是它們不是!

+0

當我切換回v1.2.4時,收到錯誤消息:com.impetus.kundera.KunderaException:com.impetus.kundera.KunderaException:Entitymatadata不應該爲null。根據配置,我有什麼可能是錯的? –

+0

看起來,包裝不正確,實體在類路徑中不可用。你可以搜索Kundera github的問題。圍繞它的討論數量很多。 –