2013-09-05 2 views
1

Je continue à recevoir le messageObtenir l'erreur NoSuchMethodError: org.apache.cassandra.thrift.TBinaryProtocol lors de l'utilisation d'Apache Cassandra, Kundera, 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) 

Chaque fois que je tente de lancer mon projet Java Spring MVC 3.2. J'essaie de me connecter à Apache Cassandra 1.2.8 que j'ai installé sur ma machine depuis Spring WebApp en utilisant Kundera. J'ai inclus les dépendances suivantes dans le fichier pom.xml du projet:

  1. scale7-Pélops (1.3-1.1.x)
  2. Cassandre tous & Cassandre clientutil (1.2.8)
  3. kundera-core & kundera-cassandra (2,6)

Mon printemps projet utilise la configuration XML-moins (Java Config) et JPA en dehors de la persistence.xml kundériens qui est sous {pROJET}/src/main/resources/META -INF pour être à la base du classpath lors du déploiement. Mon persistence.xml ressemble:

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

Et la classe de configuration créant le entityManager ressemble:

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

La classe suivante montre comment le contexte de persistance est utilisé.

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

Un échantillon de la ORM qui est mis en correspondance avec une famille de colonne dans l'installation Apache Cassandra se présente comme suit.

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

Où est-ce que je me tromperais avec ma configuration? Qu'est-ce que je suis manquant? Comment puis-je corriger l'erreur?

Répondre

0

Les librairies Kundera Cassandra fonctionnent en version 1.2.4. Idéalement, les versions 1.2.8 ou supérieures devraient toujours être rétrocompatibles, mais dans ce cas, malheureusement, elles ne le sont pas!

+0

Lorsque je repasse à v1.2.4, j'obtiens le message d'erreur: com.impetus.kundera.KunderaException: com.impetus.kundera.KunderaException: Entitymatadata ne doit pas être null. Selon la configuration j'ai ce qui pourrait être faux? –

+0

On dirait que l'empaquetage est incorrect et que les entités ne sont pas disponibles sur classpath. vous pouvez rechercher des questions de Kundera github. Il y a eu beaucoup de discussions à ce sujet là-bas. –

Questions connexes