【发布时间】:2019-09-18 03:35:05
【问题描述】:
我正在处理一个客户端服务器项目,但在将 Websocket 客户端连接到 Tomcat 服务器时遇到问题。我在本地设备上设置了 Tomcat,它运行正常。它在默认端口 8080 上运行。这是我的目录设置。
> Tomcat
> webapps
> myServer
> WEB-INF
> src
> MyClass.java
> EchoAnnotation.java
> HelloWorldServlet.java
> classes
> MyClass.class
> EchoAnnotation.class
> HelloWorldServlet.class
> web.xml
> build.xml
> lib
> javaee-api-7.0.jar
> servlet-api.jar
> {other misc jars}
> META-INF
> context.xml
> index.html
我的 web.xml 中有这个设置。
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- ======= SERVLETS ======= -->
<servlet>
<servlet-name>EchoAnnotation</servlet-name>
<servlet-class>server.EchoAnnotation</servlet-class>
</servlet>
<servlet>
<servlet-name>MyClass</servlet-name>
<servlet-class>server.MyClass</servlet-class>
</servlet>
<servlet>
<servlet-name>HelloWorldServlet</servlet-name>
<servlet-class>server.HelloWorldServlet</servlet-class>
</servlet>
<!-- ======= SERVLET MAPPING ======= -->
<servlet-mapping>
<servlet-name>EchoAnnotation</servlet-name>
<url-pattern>/server/echo</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/server/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyClass</servlet-name>
<url-pattern>/server/myclass</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.xhtml</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
我认为我在映射方面遇到了问题。我无法让我的应用程序访问我从示例中获取的 EchoAnnotation 来学习。
package server;
import java.io.IOException;
import java.nio.ByteBuffer;
import javax.websocket.OnMessage;
import javax.websocket.PongMessage;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/echo")
public class EchoAnnotation {
@OnMessage
public void echoTextMessage(Session session, String msg, boolean last) {
try {
if (session.isOpen()) {
session.getBasicRemote().sendText(msg, last);
}
} catch (IOException e) {
try {
session.close();
} catch (IOException e1) {
// Ignore
}
}
}
@OnMessage
public void echoBinaryMessage(Session session, ByteBuffer bb,
boolean last) {
try {
if (session.isOpen()) {
session.getBasicRemote().sendBinary(bb, last);
}
} catch (IOException e) {
try {
session.close();
} catch (IOException e1) {
// Ignore
}
}
}
/**
* Process a received pong. This is a NO-OP.
*
* @param pm Ignored.
*/
@OnMessage
public void echoPongMessage(PongMessage pm) {
// NO-OP
}
}
当我使用“ws://127.0.0.1:8080/examples/websocket/echoAnnotation”(来自示例)时,我的客户端工作正常,但如果我使用自己的 ws://127.0.0.1:8080/ myServer/server/echo,我运气不好。它给出了 404,但现在它给出了以下错误。
javax.servlet.ServletException: Class [server.EchoAnnotation] is not a Servlet
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:528)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:810)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.base/java.lang.Thread.run(Thread.java:835)
java.lang.ClassCastException: class server.EchoAnnotation cannot be cast to class javax.servlet.Servlet (server.EchoAnnotation is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @1497b15b; javax.servlet.Servlet is in unnamed module of loader java.net.URLClassLoader @533ddba)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:528)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:810)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.base/java.lang.Thread.run(Thread.java:835)
值得一提的是,MyClass.class 和 HelloWorldServlet.class 加载良好,但它们没有注释,也没有使用 websocket。
如何正确地将注解类映射到服务器?
【问题讨论】:
标签: java tomcat servlets websocket path