[Java][Servlet] Failed to destroy end point associated with ProtocolHandler ["http-nio-8080"]

Background: Servlet version 3.1(3.0以後就有了@WebServlet註解)java

Errorweb

嚴重: 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)
    at org.apache.catalina.core.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)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485)

十月 27, 2016 11:36:07 下午 org.apache.coyote.AbstractProtocol destroy
信息: Destroying ProtocolHandler ["ajp-nio-8009"]
十月 27, 2016 11:36:07 下午 org.apache.coyote.AbstractProtocol destroy
嚴重: 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)
    at org.apache.catalina.core.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)
    at java.lang.reflect.Method.invoke(Unknown Source)
    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中的servlet配置刪除掉,tomcat正常啓動,難道是下面的servlet配置錯了?apache

<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>

這個配置沒有問題,接下來就去看servlet的實現了,發現這個類有個註解,查看了一下這個註解的含義tomcat

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

這裏將@WebServlet("/loginServlet")註解去掉,tomcat就能啓動成功,因而問題就來了,爲何註釋掉這段註解就OK了?
咱們先看看這段註解是幹什麼的:
~~
在Servlet3.0以後,能夠使用註解來告知Servlet容器哪些Servlet會提供服務,使用@WebServlet("/loginServlet")註解表示了當url的請求爲loginServlet,則由LoginServlet實例提供服務。因此當你添加了註解,又在web.xml中進行了servlet的配置,我猜測會形成衝突,servlet會初始化2次,那麼咱們刪掉註解或者刪掉web.xml中的配置都能正常啓動tomcat。
~~app

以上是我面對這個Error找出的解決方案,不必定適合你的Error,僅供參考。url

相關文章
相關標籤/搜索