【问题标题】:How to correct the path for the annotated websocket class?如何更正带注释的 websocket 类的路径?
【发布时间】: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


    【解决方案1】:

    Websocket 端点不应被视为 servlet。从 web.xml 中删除 servlet 声明。只需尝试使用 ws://127.0.0.1:8080/myServer/echo (假设“myServer”是您的战争文件名)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      相关资源
      最近更新 更多