時,我不斷收到消息收到錯誤的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文件以下依賴性:
- scale7-貝洛布思(1.3-1.1.x)
- 卡桑德拉 - 所有&卡桑德拉 - clientutil(1.2.8)
- 昆德拉核&昆德拉 - 卡珊德拉(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;
}
}
我會在哪裏配錯我的配置?我錯過了什麼?我該如何解決這個錯誤?
當我切換回v1.2.4時,收到錯誤消息:com.impetus.kundera.KunderaException:com.impetus.kundera.KunderaException:Entitymatadata不應該爲null。根據配置,我有什麼可能是錯的? –
看起來,包裝不正確,實體在類路徑中不可用。你可以搜索Kundera github的問題。圍繞它的討論數量很多。 –