我已經有了一個REST服務春季啓動應用程序,其中包括爲兩個獨立的Maven項目:春數據休息:「無法從@EntityScan配置LocalContainerEntityManagerFactoryBean」
- 第一個
myapp-data
包括春數據JPA +春Data Rest Entities和Rest Repositories類的定義(我在單獨的Maven項目中將它們分開,因爲我在除了REST服務之外的其他應用程序中也使用它們)。 - 的塞康
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.data
在myapp-data
項目定義的包包括作爲行家依賴性,包含實體和存儲庫類定義。
在我的服務項目配置我使用Spring Security有一個自定義的UserDetailsService(不知道這是否是相關的,..這在以前的部署工作,所以可能它不是)。
感謝您的建議(我從過去幾周的假期開始才見到它)。最終,我決定在生產環境中將服務部署爲獨立(嵌入式tomcat)spring引導應用程序,而不是安裝在生產服務器的tomcat實例中。由於除了解決我的例外之外,這種方法證明我有許多其他的優點,我決定堅持這一點,並且沒有進一步調查這個問題。 在任何情況下,由於我對驗證您的解決方案是否有效感到有趣,只要我有一段時間,我會試一試,讓它知道它是否工作。 – chrx