Spring Java Config mit Mehreren Disponenten

Habe ich einige Erfahrung Frühling jetzt, und auch einige Reine java-config-web-apps im Einsatz. Aber diese basieren in der Regel auf eine ruhige, einfache Einrichtung:

  • application-config für die Dienste /repositories
  • dispatcher config für einen dispatcher (und einige Controller)
  • (optional) spring security für den sicheren Zugriff

Für mein Aktuelles Projekt benötige ich separate dispatcher Kontexten mit unterschiedlicher Konfiguration. Das ist nicht ein problem mit der XML-basierten Konfiguration, wie wir eine engagierte ContextLoaderListener das ist unabhängig von Dispatcher-Konfiguration. Aber mit java-config bin ich mir nicht sicher, ob das was ich mache ist in Ordnung so weit 😉

Hier ist eine gemeinsame DispatcherConfig:

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

  @Override
  protected Class<?>[] getRootConfigClasses() {
    return new class[]{MyAppConfig.class};
  }

  @Override
  protected Class<?>[] getServletConfigClasses() {
    return new Class[]{MyDispatcherConfig.class};
  }

  @Override
  protected String[] getServletMappings() {
    return new String[]{"/mymapping/*"};
  }

  @Override
  protected String getServletName() {
    return "myservlet";
  }
}

Wie gesagt, ich brauche einen zweiten (Dritten, ...) dispatcher mit einem anderen mapping (und view-Resolver). Also kopiert habe ich die config und Hinzugefügt getServletName() (sonst werden beide Namen als 'dispatcher', was Fehler verursachen). Die zweite config war, wie das suchen:

public class AnotherWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

  @Override
  protected Class<?>[] getRootConfigClasses() {
    return new class[]{MyAppConfig.class};
  }

  @Override
  protected Class<?>[] getServletConfigClasses() {
    return new Class[]{AnotherDispatcherConfig.class};
  }

  @Override
  protected String[] getServletMappings() {
    return new String[]{"/another_mapping/*"};
  }

  @Override
  protected String getServletName() {
    return "anotherservlet";
  }
}

Wenn ich es wie folgt, ab-Anwendung führt Sie in ein problem mit ContextLoaderListener:

java.lang.IllegalStateException: Cannot initialize context because there is already a root application context present - check whether you have multiple ContextLoader* definitions in your web.xml!
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:277)
...

So entfernte ich die zweite MyAppConfig.class Rückkehr von einer der
AbstractAnnotationConfigDispatcherservletinitializer und es funktioniert gut. Aber das fühlt sich nicht der richtige Weg 😉

Für mein Verständnis: sollte alle DispatcherConfig behandelt werden, innerhalb eines AbstractAnnotationConfigDispatcherservletinitializer oder sollte ich Sie trennen, wie ich es Tat? Ich habe versucht, konfigurieren Sie in einer Klasse, aber dann ist meine config war Total gemischt (so, glaube ich, dass das nicht der gewünschte Weg).

Wie setzen Sie so ein Fall? Ist es möglich, die ContextLoaderListener in java-config außerhalb des AbstractAnnotationConfigDispatcherservletinitializer? Oder sollte ich eine DefaultServlet, die hat nur der root-config? Was ist mit der Umsetzung der Basis-Schnittstelle, die Konfiguration WebApplicationInitializer?

Können Sie erklären, der Grund für die Notwendigkeit mehrerer Disponenten in einer einzigen Anwendung? Der springende Punkt bei der Front-Controller ist, dass Sie die multiplex-Ihre Anforderungen an.
sicher. Das Projekt ist mehr wie ein Modul-Baukasten für shared services. Diese sind nicht miteinander verbunden, sondern teilen sich die gleiche Basis-setup und Organisationen. Mit zwei Anwendungen bereitstellen, ist ein no-go in das Projekt und versuchen, konfigurieren Sie den dispatcher, um alle Art von view-Technologien (einige basieren auf Fliesen, andere jsp, die neueren auf Thymeleaf) ist auch eine schlechte Idee.
Warum ist es eine schlechte Idee? Spring Boot macht es einfach.
Spring Boot ist ein anderes Thema. Ich würde wirklich nur gerne verschiedene DispatcherServlets (mit verschiedenen web-Kontext). Das war einfach mit web.xml Konfiguration (wie ContextLoaderListener war nicht gebunden an die Dispatcher). Ich bin sicher, es gibt eine Lösung oder zumindest die beste Praxis.
Haben Sie ein soultion nutzen?

InformationsquelleAutor delimiter | 2015-03-05

Schreibe einen Kommentar