1. ホーム
  2. ジャワ

[Java][Servlet] ProtocolHandler ["http-nio-8080"] に関連付けられたエンドポイントの破棄に失敗しました。

2022-03-17 23:26:30

背景 サーブレットバージョン3.1(@WebServletアノテーションは3.0から使用可)

エラー

Serious: Failed to destroy end point associated with ProtocolHandler ["http-nio-8080"]
java.lang.NullPointerException
    at org.apache.tomcat.util.net.NioEndpoint.releaseCaches(NioEndpoint.java:316)
    at org.apache.tomcat.util.net.NioEndpoint.unbind(NioEndpoint.java:492)
    at org.apache.tomcat.util.net.AbstractEndpoint.destroy(AbstractEndpoint.java:821)
    at org.apache.coyote.AbstractProtocol.destroy(AbstractProtocol.java:551)
    at org.apache.catalina.connector.Connector.destroyInternal(Connector.java:1023)
    at org.apache.catalina.util.LifecycleBase.destroy(LifecycleBase.java:292)
    StandardService.destroyInternal(StandardService.java:589)
    at org.apache.catalina.util.LifecycleBase.destroy(LifecycleBase.java:292)
    at org.apache.catalina.core.StandardServer.destroyInternal(StandardServer.java:877)
    at org.apache.catalina.util.LifecycleBase.destroy(LifecycleBase.java:292)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:633)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    Method.invoke(Unknown Source) at java.lang.reflect.
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485)

October 27, 2016 11:36:07 PM org.apache.coyote.AbstractProtocol destroy
Info: Destroying ProtocolHandler ["ajp-nio-8009"]
October 27, 2016 11:36:07 PM org.apache.coyote.AbstractProtocol destroy
Serious: Failed to destroy end point associated with ProtocolHandler ["ajp-nio-8009"]
java.lang.NullPointerException
    at org.apache.tomcat.util.net.NioEndpoint.releaseCaches(NioEndpoint.java:316)
    at org.apache.tomcat.util.net.NioEndpoint.unbind(NioEndpoint.java:492)
    at org.apache.tomcat.util.net.AbstractEndpoint.destroy(AbstractEndpoint.java:821)
    at org.apache.coyote.AbstractProtocol.destroy(AbstractProtocol.java:551)
    at org.apache.catalina.connector.Connector.destroyInternal(Connector.java:1023)
    at org.apache.catalina.util.LifecycleBase.destroy(LifecycleBase.java:292)
    StandardService.destroyInternal(StandardService.java:589)
    at org.apache.catalina.util.LifecycleBase.destroy(LifecycleBase.java:292)
    at org.apache.catalina.core.StandardServer.destroyInternal(StandardServer.java:877)
    at org.apache.catalina.util.LifecycleBase.destroy(LifecycleBase.java:292)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:633)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    Method.invoke(Unknown Source) at java.lang.reflect.
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485)


まず、ポート番号が占有されているかどうかを分析するために netstat -ano|findstr "8080" そのポートを使っているプロセスは見つかりませんでした。そこで、コードに戻り、web.xmlからサーブレット設定を削除したところ、tomcatは正常に起動しましたが、以下のサーブレット設定が間違っている可能性はありませんか?

  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.study.servlet.LoginServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/loginServlet</url-pattern>
  </servlet-mapping>

この構成で問題なかったので、サーブレットの実装を見に行くと、クラスにアノテーションがあり、そのアノテーションの意味を調べると

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
...
}

ここで、@WebServlet("/loginServlet")のアノテーションを削除すると、tomcatは正常に起動します。では、なぜこのアノテーションをコメントアウトしても良いのでしょうか?



このコメントが何をするのかを見てみましょう。



~~



Servlet 3.0以降では、アノテーションを使ってどのServletがサービスを提供するかをServletコンテナに伝えることができます。@WebServlet("/loginServlet") アノテーションは、urlリクエストがloginServletであるとき、LoginServletインスタンスがサービスを提供することを示しています。そのため、web.xmlにアノテーションとサーブレット設定を追加すると、サーブレットが2回初期化されてしまうため、アノテーションを削除するか、web.xmlの設定を削除すると、正常にtomcatを起動できるようになると思います。



~~

上記は私が見つけたこのErrorの解決策ですが、あなたのErrorに合わないかもしれませんので、参考までに。