2013-08-28 15 views
7

Sto creando un'app Web di base con Maven, quindi l'importazione su Eclipse 4.2. Ho installato Tomcat 7 come server. Sto cercando di configurare i dati primaverili con mongodb per un'applicazione web.WebApplicationInitializer container.addServlet() restituisce null

sto seguendo l'approccio di configurazione basato su codice trovato qui: WebApplicationInitializer

Quando eseguo il progetto sul server, ottengo un'eccezione di puntatore nullo nella classe WebApplicationInitializer ho creato. La riga: container.addServlet ("dispatcher", new DispatcherServlet (dispatcherContext)); sta restituendo null.

Che diamine mi manca? Sono un po 'nuovo nella creazione di app web da zero usando le annotazioni.

Qui è la classe in questione:

public class ATWWebAppInitializer implements WebApplicationInitializer 
{ 
    @Override 
    public void onStartup(ServletContext container) throws ServletException 
    { 
     // Create the 'root' Spring application context 
     AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); 
     rootContext.register(SpringMongoConfig.class); 

     // Manage the lifecycle of the root application context 
     container.addListener(new ContextLoaderListener(rootContext)); 

     // Create the dispatcher servlet's Spring application context 
     AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext(); 
     dispatcherContext.register(ATWDispatcherConfig.class); 

     // Register and map the dispatcher servlet 
     ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext)); 
     dispatcher.setLoadOnStartup(1); 
     dispatcher.addMapping("/*"); 
    } 
} 

provato ad aggiungere questo al POM:

<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>javax.servlet-api</artifactId> 
    <version>3.0.1</version> 
    <scope>provided</scope> 
</dependency> 

non ha cambiato nulla, ancora ottenere il NPE. Ho letto qui (http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContext.html) che container.addServlet restituisce null se un servlet è già registrato? Tomcat sta già registrando un servlet?

Ci scusiamo per aver perso il tempo di tutti, Avevo un file web.xml che registrava lo stesso servlet. Quindi questo restituiva solo null. Ora per sistemare il 404, probabilmente ha incasinato il controller in qualche modo.

+0

Non proprio sicuro, una configurazione simile funziona in modo pulito per me. Quindi essenzialmente stai ricevendo un'eccezione di puntatore nullo sulla riga 'dispatcher.setLoadOnStartup()', considerando che la riga precedente sta dando un dispatcher nullo? –

+0

Questo è corretto. La riga successiva che accede al dispatcher sta lanciando l'NPE. Penso che potrebbe avere qualcosa a che fare con la servlet-API. Non ho impostato una dipendenza in POM, ho solo aggiunto il jar al mio percorso di build dalla directory di tomcat lib. – MattG

+0

Hmmmm, Sto avendo esattamente lo stesso problema e non ho alcun file 'web.xml', cercando di farlo puro annotato. – Jagger

risposta

8

In base al ServletContext JavaDoc il metodo addServlet() restituisce null se un servlet con il nome specificato è già registrato.

0

@Ravi Rao - Si è proprio corretto. Stavo facendo fatica ad eseguire la mia app sul tomcat e stavo ottenendo esattamente l'NPE su dispatcher.setLoadOnStartup().

Ma quando ho letto la risposta fornita, mi sono reso conto che c'era un'altra applicazione in esecuzione sullo stesso tomcat con lo stesso nome di quella servlet del dispatcher.

Ho appena ribattezzato il mio servlet di dispatcher e ha funzionato in modo sorprendente. Appena menzionato i passaggi esatti per risolvere questo problema. Nel caso qualcuno lo trovi utile