2014-04-26 2 views
0

Я написал веб-сервер весны mvc, который использует NEO4j в качестве базы данных. Теперь я хочу расширить это с помощью cassandra, поэтому сервер должен иметь возможность использовать обе базы данных.Autowiring Controller не работает после добавления entityManagerFactory bean

Я следовал за эти 2 руководства о том, чтобы объединить Кундера (A на основе JPA Cassandra API): https://github.com/impetus-opensource/Kundera/wiki/Using-Kundera-with-Spring https://code.google.com/p/kundera/wiki/HowToUseKunderaWithSpring

Но я не в состоянии добавить EntityManagerFactory боб в мой файл 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, он внезапно перестает работать. Как это возможно?

Мой файл 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

Соответствующая часть StackTrace является:

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

Так что вам нужно добавить зависимость к spring-orm см http://mvnrepository.com/artifact/org.springframework/spring-orm.

Однако я не уверен, что действительно решает вашу проблему. В описании вы упоминаете Neo4j, и я не вижу, какая часть вашего описания относится к этому.

+0

Спасибо, что сделал! Оказалось, что мне не хватало еще нескольких зависимостей, я должен уделять больше внимания стекам в следующий раз :) Похоже, эти зависимости необходимы, чтобы получить Kundera с весной, так как я также пробовал ее без весны, и она отлично работала. Недопустимый класс, который вы нашли, не имеет ничего общего с NEO4J, но требуется компонентом «entityManagerFactory», который я добавил в контекст приложения. – Jonhy

 Смежные вопросы

  • Нет связанных вопросов^_^