2014-04-26 4 views
0

J'ai écrit un serveur web Spring mvc qui utilise NEO4j comme backend de données. Maintenant, je veux étendre cela avec cassandra, de sorte que le serveur devrait être en mesure d'utiliser les deux bases de données.Le contrôleur automatique ne fonctionne pas après l'ajout du bean entityManagerFactory

J'ai suivi ces 2 tutoriels sur la façon de combiner Kundera (A JPA API basée Cassandra): https://github.com/impetus-opensource/Kundera/wiki/Using-Kundera-with-Spring https://code.google.com/p/kundera/wiki/HowToUseKunderaWithSpring

Mais je ne suis pas en mesure d'ajouter la fève EntityManagerFactory à mon dossier applicationContext.xml.

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

Quand je fais cela, le printemps donne une erreur qu'il ne peut pas créer des contrôleurs déjà existants que mon serveur web utilise.

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 

Ces contrôleurs sont créés en utilisant l'annotation @Controller dans leurs fichiers de classe et en les Autowiring dans les fichiers où ils sont utilisés. Cela fonctionne normalement mais lorsque j'ajoute le bean entityManagerFactory, il arrête brusquement de fonctionner. Comment est-ce possible?

Mon fichier applicationContext ressemble actuellement à ceci:

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

Et mon dossier 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 classe de domaine:

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

Quel genre de dépendances pour Spring utilisez-vous? – geoand

Répondre

2

La partie pertinente de l'stacktrace est:

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

Vous avez donc besoin d'ajouter une dépendance à spring-orm, voir http://mvnrepository.com/artifact/org.springframework/spring-orm.

Cependant, je ne suis pas sûr que cela résout vraiment votre problème. Dans la description, vous parlez de Neo4j et je ne vois pas quelle partie de votre description se rapporte à cela.

+0

Merci qui l'a fait! Il s'est avéré qu'il me manquait plus de dépendances, je devrais faire plus attention aux stacktraces la prochaine fois :) On dirait que ces dépendances sont nécessaires pour que Kundera fonctionne avec le printemps puisque je l'ai aussi essayé sans le printemps et ça a bien fonctionné. La classe manquante que vous avez trouvée n'a rien à voir avec NEO4J mais est requise par le bean "entityManagerFactory" que j'ai ajouté au contexte de l'application. – Jonhy

Questions connexes