9

Maven を使用して基本的な Web アプリを作成し、Eclipse 4.2 にインポートしています。サーバーとしてTomcat 7をセットアップしています。Web アプリ用に mongodb で春のデータを構成しようとしています。

ここにあるコードベースの構成アプローチに従っています: WebApplicationInitializer

サーバー上でプロジェクトを実行すると、作成した WebApplicationInitializer クラスで null ポインター例外が発生します。行: container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext)); nullを返しています。

私は一体何が欠けているのですか?注釈を使用してゼロから Web アプリを作成するのは初めてです。

問題のクラスは次のとおりです。

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("/*");
    }
} 

これをPOMに追加しようとしました:

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

何も変更せず、まだ NPE を取得しています。ここ ( http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContext.html ) で、サーブレットが既に登録されている場合、 container.addServlet が null を返すことを読みましたか? Tomcat はすでにサーブレットを登録していますか?

皆さんの時間を無駄にして申し訳ありません。同じサーブレットを登録する web.xml ファイルもありました。 したがって、これはnullを返すだけでした。404の修正に進みますが、おそらく何らかの形でコントローラーを台無しにしました。

4

2 に答える 2

13

ServletContext JavaDocによると、指定された名前のサーブレットがすでに登録されている場合、 addServlet() メソッドは null を返します。

于 2015-11-07T11:37:09.107 に答える
1

@Ravi Rao - あなたは正確に正しいです。Tomcat でアプリを実行するのに苦労し、dispatcher.setLoadOnStartup() で正確に NPE を取得していました。

しかし、あなたが提供した回答を読んだとき、そのディスパッチャ サーブレットと同じ名前の同じ tomcat で実行されている別のアプリケーションがあることに気付きました。

ディスパッチャ サーブレットの名前を変更したところ、驚くほど機能しました。この問題を解決するための正確な手順について言及しました。誰かがそれが役に立つと思った場合に備えて

于 2017-01-07T19:06:07.413 に答える