Spring Data Rest:"无法从@ EntityScan配置LocalContainerEntityManagerFactoryBean"

时间:2016-07-27 10:02:12

标签: spring-boot tomcat7 spring-data-rest

我有一个REST服务spring启动应用程序,包含两个独立的maven项目:

  1. 第一个myapp-data包括Spring Data JPA + Spring Data Rest Entities和Rest Repositories类定义(我已经将它们隔离在一个单独的maven项目中,因为我在除了我的REST服务之外的其他应用程序中也使用它们)。
  2. secon myapp-services是一个Spring Boot应用程序,它基本上包含main方法+配置,以将上述Spring Data Rest存储库公开为REST端点。
  3. 如果我在本地开发环境中运行它(STS Eclipse,在我的本地开发机器上启动mvn spring-boot:run)一切似乎工作正常,但是当我将它作为战争部署在一个staging tomcat环境(tomcat7下) ubuntu 14.04)我在下面的框中得到了例外。请注意,除此之外,两个部署中的差异仅包括application.properties中的不同设置(数据库连接,日志记录级别等)。

    在我做了一些代码更改之前(在以前的版本中我使用了普通的JPA存储库和自定义Rest控制器而不是Spring Data Rest存储库),在开发和登台环境中部署的应用程序都很好。当我添加Spring Data Rest存储库时,问题可能开始出现了,但是我对这一点并不是100%肯定,因为我在连续的一些小的更改之后部署在登台环境中。

    这是异常堆栈跟踪:

    java.lang.IllegalStateException: Unable to configure LocalContainerEntityManagerFactoryBean from @EntityScan, ensure an appropriate bean is registered.
            at org.springframework.util.Assert.state(Assert.java:392)
            at org.springframework.boot.orm.jpa.EntityScanRegistrar$EntityScanBeanPostProcessor.afterSingletonsInstantiated(EntityScanRegistrar.java:148)
            at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:792)
            at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
            at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
            at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
            at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766)
            at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361)
            at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
            at org.springframework.boot.context.web.SpringBootServletInitializer.run(SpringBootServletInitializer.java:149)
            at org.springframework.boot.context.web.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:129)
            at org.springframework.boot.context.web.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:85)
            at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:169)
            at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5456)
            at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
            at org.apache.catalina.manager.ManagerServlet.start(ManagerServlet.java:1256)
            at org.apache.catalina.manager.HTMLManagerServlet.start(HTMLManagerServlet.java:692)
            at org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.java:217)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
            at org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:213)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
            at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
            at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
            at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
            at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:610)
            at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
            at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
            at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
            at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
            at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
            at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
            at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
            at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
            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:745)
    

    这是myapp-services项目的主要Application类:

    package eu.myapp.services;
    
    @ComponentScan(value="eu.myapp")
    @EnableJpaRepositories("eu.myapp.data")
    @EntityScan(value="eu.myapp.data")
    @SpringBootApplication
    public class MyappServicesApplication extends SpringBootServletInitializer {
    
        public static void main(String[] args) {
            SpringApplication.run(MyappServicesApplication.class, args);
        }
    }
    

    其中eu.myapp.data是包含在maven依赖项中的myapp-data项目中定义的包,包含实体和存储库类定义。

    在我的服务项目配置中,我使用Spring Security和自定义UserDetailsS​​ervice(不知道这是否相关,...它在以前的部署中有效,所以可能不是)。

2 个答案:

答案 0 :(得分:2)

我不知道是否为时已晚,但我会告诉您我为解决此问题所采取的措施以供将来参考。

显然,问题与Spring Security和自定义UserDetailsS​​ervice有关。

我认为一旦SpringSecurity尝试同时访问数据库层,主应用程序类和配置类之间就会发生冲突。

要解决此问题,您可以将标记@Order(1)添加到主类,将另一个标记(例如@Order(30))添加到安全类。

我不知道为什么只有在将应用程序部署到网络服务器(Glassfish 4.1.1对我来说)时才会发生。

我希望它有所帮助。

其他参考资料:

https://github.com/spring-projects/spring-boot/issues/1008

答案 1 :(得分:1)

不确定这是否对任何人有帮助,但......

我遇到了同样的问题,最后成为一个

的班级

extends org.springframework.boot.context.web.SpringBootServletInitializer

导致了这个问题。我能够重构代码并将其取出,消除错误。

希望有人觉得这很有用。