2010-07-16 3 views
5

Ich muss jede neue HTTP-Sitzung mit einigen Werten initialisieren. Wie mache ich das?Wie man etwas beim Start der Sitzung in Spring MVC tun?

Ich habe versucht, eine Session-Bereich Komponente und Initialisierungssitzung in @PostConstruct zu erstellen, aber Session-Bereich Bohnen werden nicht eifrig erstellt, bis ich Anfrage zugreifen sie.

+0

Wenn diese initialisierten Werte von etwas anderem verwendet werden sollen, ist es sicherlich gut genug, dass sie initialisiert werden, wenn sie das erste Mal referenziert werden? – skaffman

+0

Ich habe eine Bean, die einige benutzerbezogene Werte enthält. Ich möchte hier keine Initialisierungslogik einfügen, da dies eine separate Verantwortung ist. Ich möchte auch nicht den Aufruf der Initialisierungsmethode in Services setzen, die auf diese Session-Bean verweisen. Ich kann keine korrekte Art der Initialisierung auf Referenz sehen – artemb

+0

Können Sie dies in spezifischen Beispielcode ausdrücken, zeigen, wie Sie es gerne arbeiten würde? Ich habe den Verdacht, dass das einfacher ist als Sie denken. – skaffman

Antwort

3

Wenn Sie absolut sicher sind, dass Ihr wünschen eifrig Initialisierung, können Sie Folgendes tun:

  • ein Abfangjäger für alle
  • Bohnen definieren
  • DeFina eine <lookup-method> für die Abfangjäger:

    <lookup-method name="getCurrentSessionBean" 
        bean="yourSessionBeanToInitialize"/> 
    
  • definieren den Interzeptor abstract, mit einer abstract Methode getCurrentSessionBean()

  • Erstellen Sie ein Flag initialized auf der Bean
  • bei jedem Abfangen, rufen Sie die Lookup-Methode und es wird eine Instanz der Bean aus der aktuellen Sitzung zurückgeben. Wenn es nicht initialisiert (die Flagge), initialisieren es
  • Sie auch @PostConstruct und schonen die initizlied Flagge

Eine weitere Option verwenden können, ist zu:

  • eine HttpSessionListener in web.xml definieren (oder mit Anmerkungen bei Verwendung von Servlet 3.0)
  • Verwendung WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext) dem Kontext zu erhalten
  • Anruf getBean(..) auf eine Instanz der Session-scoped Bohne zu erhalten
  • es wird mit @PostConstruct an diesem Punkt

Die erste Option ist „mehr spring“ initialisiert werden, der zweite einfacher und schneller zu implementieren ist.

+0

In Methode 2, wo bekomme ich ServletContext? – artemb

+0

Verstanden: HttpSessionEvent.getSession(). GetServletContext() – artemb

+0

Ich benutze eine aop-proxied session-Bereich Bean Benutzerinfo, um Benutzer Sitzungsinformationen zu halten. Das Problem ist, dass die Instanz von UserInfo, die ich im Sitzungs-Listener erhalte, sich von der unterscheidet, die ich in meinem Controller erhalte. Ich schätze, das kann ein Problem in verschiedenen Kontexten sein, aber ich bin mir nicht sicher – artemb