2016-07-27 44 views
3

ich eine REST-Service Frühjahr Boot-Anwendung haben, besteht in zwei separate Maven Projekte:Spring Data Rest: "Kann nicht LocalContainerEntityManagerFactoryBean von @EntityScan konfigurieren"

  1. Die erste myapp-data enthält Spring Data JPA + Frühling Klassendefinitionen für Datenrest-Entitäten und Rest-Repositories (Ich habe diese in einem separaten Maven-Projekt isoliert, da ich sie auch in anderen Anwendungen neben meinem REST-Service verwende).
  2. Der secon myapp-services ist eine Spring Boot-Anwendung, die im Wesentlichen die Methode + method + Konfiguration enthält, um die oben genannten Spring Data Rest-Repositorys als REST-Endpunkte verfügbar zu machen.

Wenn ich laufe diese in einer lokalen Entwicklungsumgebung (STS Eclipse mvn spring-boot:run auf meiner lokalen Entwicklung Maschine starten) alles scheint gut zu funktionieren, aber wenn ich implementieren sie als Krieg auf einer Staging tomcat Umgebung (tomcat7 unter ubuntu 14.04) Ich habe die Ausnahme in der Box unten. Beachten Sie, dass außerdem der Unterschied in den beiden Bereitstellungen nur in verschiedenen Einstellungen von application.properties (db-Verbindung, Protokollierungsebenen usw.) besteht.

Bevor einige Codeänderungen vorgenommen wurden (in früheren Versionen habe ich zum Beispiel normale JPA-Repositorys und benutzerdefinierte Rest-Controller anstelle von Spring Data Rest-Repositorys verwendet), wurde die Anwendung in Entwicklungs- und Staging-Umgebungen ordnungsgemäß implementiert. Das Problem trat wahrscheinlich auf, als ich die Spring Data Rest-Repositorys hinzufügte, aber ich bin nicht 100% sicher, da ich nach einer Reihe anderer kleinerer Änderungen in der Staging-Umgebung implementiert habe.

Dies ist der Ausnahme-Stack-Trace:

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) 

Dies ist die Hauptanwendungsklasse für das myapp-services Projekt:

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

wo eu.myapp.data das Paket im myapp-data Projekt enthielt als Maven Abhängigkeit definiert ist , die Definitionen von Entitäten und Repository-Klassen enthalten.

In meiner Service-Projektkonfiguration verwende ich Spring Security mit einem benutzerdefinierten UserDetailsService (weiß nicht, ob dies relevant sein könnte, .. es funktionierte in früheren Bereitstellungen, also ist es wahrscheinlich nicht).

Antwort

2

Ich weiß nicht, ob es zu spät ist, aber ich werde Ihnen sagen, was ich getan habe, um dieses Problem für zukünftige Referenzen zu beheben.

Scheinbar hängt das Problem mit Spring Security und dem benutzerdefinierten UserDetailsService zusammen.

Ich denke, dass es einen Konflikt zwischen der Hauptanwendungsklasse und Ihrer Konfigurationsklasse für SpringSecurity gibt, sobald sie versuchen, gleichzeitig auf die Datenbankebene zuzugreifen.

Um dies zu beheben, können Sie das Tag @Order (1) zu der Hauptklasse und einen anderen (@Order (30) zum Beispiel) zur Sicherheitsklasse hinzufügen.

Ich weiß nicht, warum es nur passiert, wenn Sie die Anwendung auf einem Webserver (Glassfish 4.1.1 für mich) bereitstellen.

Ich hoffe es hilft.

Weitere Referenzen:

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

+0

Danke für Ihren Vorschlag (Ich sehe es erst jetzt, seit ich in den letzten Wochen Urlaub hatte). Am Ende habe ich beschlossen, den Dienst auch als eigenständige (Embedded Tomcat) Springboot-App in der Produktion zu implementieren, anstatt ihn auf der Tomcat-Instanz der Produktionsserver zu installieren. Da diese Lösung neben der Lösung meiner Ausnahme viele andere Vorteile hatte, entschloss ich mich, mich daran zu halten und das Problem nicht weiter zu untersuchen. In jedem Fall, da ich bei der Überprüfung, ob Ihre Lösung funktioniert, interessant bin, sobald ich etwas Zeit habe, werde ich es versuchen und lassen Sie wissen, ob es funktionierte. – chrx

1

nicht sicher, ob dies jemand helfen wird, aber ...

Ich hatte das gleiche Problem und es Liquidation eine Klasse ist, dass

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

, die das Problem verursacht hat. Ich konnte den Code umgestalten und den Fehler beseitigen.

Hoffe jemand findet das nützlich.