【问题标题】:Spring - At least one JPA metamodel must be presentSpring - 必须存在至少一个 JPA 元模型
【发布时间】:2016-06-24 09:27:28
【问题描述】:

我正在尝试创建一个Spring Data 应用程序。

问题: 运行Spring 应用程序我遇到了问题:

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)

我已经研究过这个问题。不幸的是,我发现只有一个 post 对我没有帮助。

问题:为什么不应该出现 jpa 模型?

我的repository界面

public interface MachineRepository extends CrudRepository<MachineAnno, Integer>{

    List<MachineAnno> findByName(String name);

} 

在调度程序 servlet 文件中创建 interface's implementation 的 bean:

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

我的controller 班级

@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();
    }

}

【问题讨论】:

  • 为什么你有一个实现,你不应该有它,因为它是在运行时由 Spring Data 生成的。也将其命名为entity manager 是一个非常糟糕的主意。
  • @M.Deinum :我已根据您的建议更新了我的代码。 bean 现在看起来像: 并且我收到错误消息:无法实例化 [com.something.dao.MachineRepository]: Specified class is an接口 - 这就是我实现存储库的原因..
  • 我建议阅读 Spring Data JPA 文档...您似乎正在使用您缺乏理解的技术。
  • @jublikon,你可以在那里生成基本的可行项目 -> start.spring.io。那么您唯一需要的就是将您现有的存储库接口添加到其中。

标签: java spring spring-mvc spring-data-jpa


【解决方案1】:

您是否在您的 servlet 文件中添加了以下行?

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

这是 servlet 的示例,

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

【讨论】:

    猜你喜欢
    • 2017-09-01
    • 2018-03-06
    • 2018-07-21
    • 1970-01-01
    • 2018-10-19
    • 2018-01-01
    • 2017-04-05
    • 2018-11-08
    • 2017-05-06
    相关资源
    最近更新 更多