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


Background: Servlet version 3.1(3.0之后就有了@WebServlet注解)

Error

嚴重: 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配置錯了?

  <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的實現了,發現這個類有個注解,查看了一下這個注解的含義

@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。
~~

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM