spring web, security + web.xml + mvc dispatcher + Bean viene creato due volte

Ho il Web.xml come di seguito:

 mvc-dispatcher org.springframework.web.servlet.DispatcherServlet 1   mvc-dispatcher /   springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy   springSecurityFilterChain /api/secure/*  

[Modificare]

Dopo aver aggiunto la sicurezza di spring, ho ricevuto l’errore!

java.lang.IllegalStateException: Nessun WebApplicationContext trovato: nessun ContextLoaderListener registrato?

poi ho aggiunto

   contextConfigLocation  /WEB-INF/mvc-dispatcher-servlet.xml    org.springframework.web.context.ContextLoaderListener  

quindi sembra funzionare bene, ma poi 1) Il problema è che i bean vengono creati due volte!

se rimuovo solo quello:

  contextConfigLocation  /WEB-INF/mvc-dispatcher-servlet.xml   

ma lascia il quindi l’applicazione web non viene eseguita affatto

[Extra]

Il completo Web.xml è qui sotto:

  Spring MVC Application  mvc-dispatcher org.springframework.web.servlet.DispatcherServlet 1   mvc-dispatcher /   springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy   springSecurityFilterChain /api/secure/*   contextConfigLocation  /WEB-INF/mvc-dispatcher-servlet.xml    org.springframework.web.context.ContextLoaderListener   

ecco il mio mvc-dispatcher-servlet.xml

                                                     

Durante il ciclo di vita del contenitore del servlet, il contenitore inizializza prima ServletContextListener , quindi le istanze Filter e Servlet .

Un’applicazione Web Spring in genere carica due contesti: il contesto root e il contesto servlet del dispatcher. La class ContextLoaderListener è un ServletContextListener che carica il contesto dell’applicazione (o radice). Identifica il file da caricare tramite il context-param con il nome contextConfigLocation come indicato nel web.xml come sotto

  contextConfigLocation  /WEB-INF/mvc-dispatcher-servlet.xml   

o, per impostazione predefinita, cercando un file in /WEB-INF/applicationContext.xml . Poiché hai specificato contextConfigLocation come contextConfigLocation , quel contesto verrà caricato.

Fatto ciò, il contenitore inizializza il DispatcherServlet , che carica anche un contesto. Identifica il caricamento del file tramite un elemento init-param con il nome contextConfigLocation come indicato nel web.xml sottostante

  dispatcher org.springframework.web.servlet.DispatcherServlet  contextConfigLocation /WEB-INF/spring/appServlet/some-random-location.xml   

oppure, per impostazione predefinita, cercando un file in /WEB-INF/name-of-your-servlet-servlet.xml . In altre parole, prende il valore dell’elemento e aggiunge -servlet.xml e lo cerca in WEB-INF .

Poiché non è stato specificato un init-param con nome contextConfigLocation , DispatcherServlet carica il file di contesto in /WEB-INF/mvc-dispatcher-servlet.xml , poiché il suo nome è mvc-dispatcher . Il contesto caricato da DispatcherServlet ha accesso ai bean caricati da ContextLoaderListener , è per questo che chiamiamo il contesto di root (e gli altri figli).

Tutto ciò per dire che sia il vostro ContextLoaderListener che il DispatcherServlet stanno creando la propria copia di un ApplicationContext caricando ciascuno un XmlWebApplicationContext dallo stesso file su /WEB-INF/mvc-dispatcher-servlet.xml .

Identifica i bean o la configurazione che ritieni debbano essere disponibili per l’intera applicazione e inseriscili nel file che verrà caricato da ContextLoaderListener . Identificare i bean o la configurazione che si ritiene debba essere disponibile per DispatcherServlet e inserirli nel relativo file di contesto.

http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch16s02.html

Il framework, all’avvio di un DispatcherServlet, cercherà un file denominato [nome-servlet] -servlet.xml nella directory WEB-INF della tua applicazione web e creerà i bean definiti lì (ignorando le definizioni di qualsiasi bean definito con stesso nome nell’ambito globale).

Quindi puoi rimuovere il context-param:

  contextConfigLocation  /WEB-INF/mvc-dispatcher-servlet.xml   

Spring MVC quindi crea un nuovo any-name.xml e inserisce bean specifici del contesto come Spring-security.xml e per il bean di sicurezza da caricare.

Il nuovo xml sarà così

          /WEB-INF/jdbc.properties           

e ora includi questo in web.xml

   contextConfigLocation  /WEB-INF/login-security.xml, /WEB-INF/application-context.xml   

spero che questo ti possa aiutare.