2016-06-24 6 views
1

Ich versuche eine Spring Data Anwendung zu erstellen.Spring - Mindestens ein JPA Metamodell muss vorhanden sein

Problem: Ausführen des Spring Anwendung ich die Frage bekommen:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: At least one JPA metamodel must be present! 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:753) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) 
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:666) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:632) 
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:680) 
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:551) 
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:492) 
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:158) 
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1238) 
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1151) 
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:828) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.IllegalArgumentException: At least one JPA metamodel must be present! 
    at org.springframework.util.Assert.notEmpty(Assert.java:276) 
    at org.springframework.data.jpa.mapping.JpaMetamodelMappingContext.<init>(JpaMetamodelMappingContext.java:52) 
    at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:71) 
    at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:26) 
    at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:134) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) 

ich für dieses Thema erforscht. Leider habe ich nur eine post gefunden, die mir nicht geholfen hat.

Frage: Warum sollte das jpa-Modell nicht vorhanden sein?

Meine repository Schnittstelle

public interface MachineRepository extends CrudRepository<MachineAnno, Integer>{ 

    List<MachineAnno> findByName(String name); 

} 

Erstellen Bohne des interface's implementation in Dispatcher Servlet-Datei:

<bean id="entityManager" class="com.something.dao.MachineRepositoryImpl"/> 

Meine controller Klasse

@RestController 
public class HomeController { 

    @Autowired 
    private MaschineDAO maschineDAO; 

    @Autowired 
    private final MachineRepository machineRepository; 

    @Autowired 
    HomeController(MachineRepository machineRepository) { 
     this.machineRepository = machineRepository; 
    } 

    @RequestMapping(value = "/machineAnno", method = RequestMethod.GET) 
    Iterable<MachineAnno> readMachines(@PathVariable String userId) { 

     return this.machineRepository.findAll(); 
    } 

} 
+1

Warum Sie eine Implementierung verfügen, sollten Sie das nicht haben, wie das ist zur Laufzeit von Spring Data generiert. Es ist auch eine schlechte Idee, sie als "Entity Manager" zu bezeichnen. –

+0

@M.Deinum: Ich habe meinen Code mit Ihren Vorschlägen aktualisiert. Die Bean sieht jetzt so aus: und ich bekomme die Fehlermeldung: Instantiiert [com.something.dao.MachineRepository]: Angegebene Klasse ist ein Interface - das ist der Grund, warum ich eine Implementierung des Repository gemacht habe. – jublikon

+0

Ich empfehle ein Lesen der Federdaten JPA-Dokumentation ... Sie scheinen Technologien zu verwenden, für die Sie das Verständnis fehlt. –

Antwort

1

Haben u die Folowing Linien in Ihrem Servlet hinzufügen Datei?

<beans:property name="annotatedClasses"> 
    <beans:list> 
     <beans:value>com.something.(packageName of ur entity).MachineAnno</beans:value><!-- Models --> 
    </beans:list> 
</beans:property> 

Hier ist das Beispiel für das Servlet ist,

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 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"> 
<beans:bean 
class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
<beans:property name="prefix" value="/WEB-INF/views/" /> 
<beans:property name="suffix" value=".jsp" /> 
</beans:bean> 

<context:component-scan base-package="com.app" /> 

<beans:bean id="dataSource" 
class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
<beans:property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
<beans:property name="url" value="jdbc:mysql://localhost:3306/test" /> 
<beans:property name="username" value="xxx" /> 
<beans:property name="password" value="xxx" /> 
</beans:bean> 

<beans:bean id="sessionFactory" 
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
<beans:property name="dataSource" ref="dataSource" /> 
<beans:property name="annotatedClasses"> 
    <beans:list> 
     <beans:value>com.app.Book</beans:value><!-- Models --> 
<!-- <beans:value>com.com.app.Author 
     </beans:value> --> 
    </beans:list> 
</beans:property> 
<beans:property name="hibernateProperties"> 
    <beans:props> 
     <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect 
     </beans:prop> 
     <beans:prop key="hibernate.hbm2ddl.auto">update</beans:prop> 
     <beans:prop key="hibernate.show_sql">${hibernate.show_sql}</beans:prop> 
    </beans:props> 
</beans:property> 
</beans:bean> 

<beans:bean id="txManager" 
class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
<beans:property name="sessionFactory" ref="sessionFactory" /> 
</beans:bean> 

<beans:bean id="persistenceExceptionTranslationPostProcessor" 
class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /> 

<context:component-scan base-package="com.app.books" /> 

<beans:bean id="bookDaoImpl" class="com.app.BookDaoImpl" /><!--daoImpl classes --> 
<beans:bean id="bookServiceImpl" class="com.app.BookServiceImpl" /><!--serviceImpl classes