2016-07-27 69 views
3

我已經有了一個REST服務春季啓動應用程序,其中包括爲兩個獨立的Maven項目:春數據休息:「無法從@EntityScan配置LocalContainerEntityManagerFactoryBean」

  1. 第一個myapp-data包括春數據JPA +春Data Rest Entities和Rest Repositories類的定義(我在單獨的Maven項目中將它們分開,因爲我在除了REST服務之外的其他應用程序中也使用它們)。
  2. 的塞康myapp-services是基本上包含main方法+配置以暴露上述彈簧數據休息庫作爲REST端點一個Spring啓動應用程序。

如果我在本地開發環境(STS的Eclipse,我的本地開發機器上啓動mvn spring-boot:run)似乎一切都正常工作,但運行這個當我部署它作爲戰爭的一個臨時的tomcat環境(ubuntu下tomcat7 14.04)我在下面的框中得到了例外。請注意,除此之外,兩個部署的差別僅在於application.properties(db連接,日誌記錄級別等)的不同設置。

我做了一些更改代碼(在以前的版本,例如我用正常的JPA庫和自定義休息控制器,而不是春數據倉庫休息)之前的應用程序都在開發和分期環境部署的罰款。當我添加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項目的主應用程序類:

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.datamyapp-data項目定義的包包括作爲行家依賴性,包含實體和存儲庫類定義。

在我的服務項目配置我使用Spring Security有一個自定義的UserDetailsS​​ervice(不知道這是否是相關的,..這在以前的部署工作,所以可能它不是)。

回答

2

我不知道是否爲時已晚,但我會告訴你我爲解決未來引用問題所做的工作。

顯然這個問題與Spring Security的自定義UserDetailsS​​ervice有關。

我認爲有主應用程序類和SpringSecurity配置類之間的衝突,一旦他們試圖在同一時間訪問到數據庫層。

爲了解決這個問題,可以將標籤@Order(1)添加到主類和(例如@Order(30))的不同的一個來安全類。

我不知道爲什麼只有當你(對我的Glassfish 4.1.1)將應用程序部署到Web服務器發生。

我希望它有幫助。

其他參考資料:

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

+0

感謝您的建議(我從過去幾周的假期開始才見到它)。最終,我決定在生產環境中將服務部署爲獨立(嵌入式tomcat)spring引導應用程序,而不是安裝在生產服務器的tomcat實例中。由於除了解決我的例外之外,這種方法證明我有許多其他的優點,我決定堅持這一點,並且沒有進一步調查這個問題。 在任何情況下,由於我對驗證您的解決方案是否有效感到有趣,只要我有一段時間,我會試一試,讓它知道它是否工作。 – chrx

1

不知道這是否會幫助任何人,但...

我有同樣的問題,它清盤是一類

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

這是造成這個問題。我能夠重構代碼並將其解決,消除了錯誤。

希望有人認爲這有用。