2014-04-26 2 views
0

NEO4j를 데이터 백엔드로 사용하는 스프링 mvc 웹 서버를 작성했습니다. 이제 나는 이것을 cassandra로 확장하려고합니다. 따라서 서버는 두 데이터베이스를 모두 사용할 수 있어야합니다.entityManagerFactory 빈을 추가 한 후에 Autowiring Controller가 작동하지 않습니다.

나는 쿤데라 (A JPA 기반 카산드라 API)를 결합하는 방법에 대한 이러한 2 자습서를 따랐다 : https://github.com/impetus-opensource/Kundera/wiki/Using-Kundera-with-Spring https://code.google.com/p/kundera/wiki/HowToUseKunderaWithSpring

하지만 난 내 applicationcontext.xml 파일에의 EntityManagerFactory 빈을 추가 할 수 아니에요.

 <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

어떤 종류의 스프링 의존성을 사용하고 있습니까? – geoand

답변

2

스택 트레이스의 관련 부분은 다음과 같습니다

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

그래서 당신은 http://mvnrepository.com/artifact/org.springframework/spring-orm를 참조 spring-orm에 종속성을 추가해야합니다.

그러나 실제로 문제가 해결되지는 않습니다. 설명에서 당신은 Neo4j에 대해 언급하고 있으며 귀하의 설명 부분이 그 부분과 관련이 있는지를 볼 수 없습니다.

+0

고마워! 내가 더 의존성을 잃어 버렸어, 나는 stacktraces에 다음 번에 더 많은주의를 기울여야한다 :) 그 의존성이 Spring과 함께 Kundera를 실행하는 데 필요한 것처럼 보인다. 스프링없이 시도했기 때문에 잘 동작했다. 발견 된 누락 된 클래스는 NEO4J와는 아무런 관계가 없지만 응용 프로그램 컨텍스트에 추가 한 "entityManagerFactory"bean에서 필요합니다. – Jonhy