2014-04-26 37 views
0

我寫了一個使用NEO4j作爲數據後端的spring mvc web服務器。現在我想用cassandra擴展它,所以服務器應該能夠使用這兩個數據庫。添加entityManagerFactory bean後,自動裝配控制器不起作用

我已經按照如何昆德拉(基於JPA卡桑德拉API)結合這2個教程: https://github.com/impetus-opensource/Kundera/wiki/Using-Kundera-with-Spring https://code.google.com/p/kundera/wiki/HowToUseKunderaWithSpring

,但我不能夠將EntityManagerFactory的bean添加到我的applicationContext.xml文件。

 <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="persistenceUnitName" value="cassandra_pu"/> 
    </bean> 

當我這樣做,春天給出了一個錯誤,它不能創造任何我的網絡服務器使用現有的控制器。

Context initialization failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'indexController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private bmsapp.service.DataBasePopulator bmsapp.controller.IndexController.dbPopulator; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] for bean with name 'entityManagerFactory' defined in class path resource [applicationContext.xml]; nested exception is java.lang.ClassNotFoundException: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) 
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) 
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4797) 
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5291) 
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) 
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:744) 
    Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private bmsapp.service.DataBasePopulator bmsapp.controller.IndexController.dbPopulator; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] for bean with name 'entityManagerFactory' defined in class path resource [applicationContext.xml]; nested exception is java.lang.ClassNotFoundException: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508) 
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) 
... 22 more 

這些控制器都通過類文件使用註解@Controller並在使用它們的文件自動裝配他們創造。這工作正常,但是當我添加entityManagerFactory bean它突然停止工作。這怎麼可能?

我的applicationContext文件目前看起來是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
xmlns:neo4j="http://www.springframework.org/schema/data/neo4j" 
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd 
http://www.springframework.org/schema/data/neo4j 
http://www.springframework.org/schema/data/neo4j/spring-neo4j-2.0.xsd 
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
"> 

<!-- Scans the classpath for annotated components that will be auto-registered 
    as Spring beans. For example @Controller and @Service. --> 
<context:component-scan base-package="bmsapp" /> 

<!-- Activate Spring Data Neo4j repository support --> 
<neo4j:config storeDirectory="data/graph.db" base-package="bmsapp.domain" /> 
<neo4j:repositories base-package="bmsapp.repository" /> 

<bean 
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> 

<bean 
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> 

<bean id="messageSource" 
    class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basename" value="messages" /> 
</bean> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="cassandra_pu"/> 
</bean> 

<tx:annotation-driven mode="proxy" /> 
<!-- context:annotation-config/--> 
<!-- use this for Spring Jackson JSON support --> 
<mvc:annotation-driven /> 

我的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>  
    <properties>    
     <property name="kundera.nodes" value="localhost"/> 
     <property name="kundera.port" value="9160"/> 
     <property name="kundera.keyspace" value="KunderaExamples"/> 
     <property name="kundera.dialect" value="cassandra"/> 
     <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-test.xml"/>     
    </properties>  
</persistence-unit> 

SimpleComment域類:

package bmsapp.domain; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.Table; 
import javax.xml.bind.annotation.XmlRootElement; 
@Entity 
@Table(name = "SIMPLE_COMMENT", schema = "[email protected]_pu") 
@XmlRootElement(name = "SimpleComment") 
public class SimpleComment { 
@Id 
@Column(name = "COMMENT_ID") 
private int id; 

@Column(name = "USER_NAME") 
private String userName; 

@Column(name = "COMMENT_TEXT") 
private String commentText; 

public SimpleComment() { 
} 

public SimpleComment(int commentId, String userName, String commentText) { 
    this.id = commentId; 
    this.userName = userName; 
    this.commentText = commentText; 
} 

public int getId() { 
    return id; 
} 

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

public String getUserName() { 
    return userName; 
} 

public void setUserName(String userName) { 
    this.userName = userName; 
} 

public String getCommentText() { 
    return commentText; 
} 

public void setCommentText(String commentText) { 
    this.commentText = commentText; 
} 
} 

SPRI ngExampleDao:

package bmsapp.repository; 
import java.util.List; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.PersistenceContext; 
import javax.persistence.PersistenceContextType; 
import javax.persistence.Query; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 

import bmsapp.domain.SimpleComment; 

@Service 
public class SpringExampleDao 
{ 
    @PersistenceContext(type=PersistenceContextType.EXTENDED) 
    private EntityManager entityManager; 

    public SimpleComment addComment(int id, String userName, String commentText) 
    { 
     SimpleComment simpleComment = new SimpleComment(id, userName, commentText);   
     entityManager.persist(simpleComment); 
     return simpleComment; 
    } 

    public SimpleComment getCommentById(String Id) 
    { 

     SimpleComment simpleComment = entityManager.find(SimpleComment.class, Id); 
     return simpleComment; 
    } 

    public List<SimpleComment> getAllComments() 
    { 
     Query query = entityManager.createQuery("SELECT c from SimpleComment c"); 
     List<SimpleComment> list = query.getResultList(); 
     return list; 
    } 
} 
+0

您使用的是什麼樣的Spring依賴關係? – geoand

回答

2

堆棧跟蹤的相關部分是:

nested exception is java.lang.ClassNotFoundException: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean 

所以,你需要依賴增加spring-orm,看http://mvnrepository.com/artifact/org.springframework/spring-orm

但是,我不確定這是否真的解決了您的問題。在描述中你提到了Neo4j,我看不到你的描述的哪一部分與此相關。

+0

謝謝你做到了!原來我錯過了一些更多的依賴關係,下次我應該更多地關注堆棧跟蹤:)看起來像那些依賴需要讓昆德拉用春天運行,因爲我也試過它沒有春天,它工作正常。您發現的缺失類與NEO4J無關,但是被添加到應用程序上下文中的「entityManagerFactory」bean需要。 – Jonhy