【问题标题】:NoSuchMethodError HttpServletRequest.getServletContext() on Servlet >3.0Servlet >3.0 上的 NoSuchMethodError HttpServletRequest.getServletContext()
【发布时间】:2015-11-24 15:19:33
【问题描述】:

我正在尝试在 Jetty 中设置 WebSocketServlet。

我根据this guide设置了servlet,根据this one实现了WebSocket。但是,当我运行gradle jettyRun 并尝试打开与ws://localhost:8080/myProjectName/echo 的连接(使用this)时,我得到java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.getServletContext()full stacktrace

see 说这个方法只在 servlet 3.0 中引入 - 但是,由于我使用的是servlet-api:3.1.0,我相信我应该有那个方法?

我有理由确定我的WEB-INF/web.xml 中的路由是正确的,因为当我尝试点击另一个 url(例如ws://localhost:8080/myProjectName/echo123)时,我没有在终端上得到错误输出。


文件:

build.gradle:

apply plugin: 'java'
apply plugin : 'jetty'

sourceCompatibility = 1.5
version = '1.0'

repositories {
    mavenCentral()
}

dependencies {
    compile 'javax.servlet:javax.servlet-api:3.1.0'
    compile 'org.eclipse.jetty:jetty-server:9.3.2.v20150730'
    compile 'org.eclipse.jetty.websocket:websocket-servlet:9.0.0.M3'
    compile 'org.eclipse.jetty.aggregate:jetty-all:9.1.3.v20140225'
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">

    <servlet>
        <servlet-name>EchoServlet</servlet-name>
        <servlet-class>org.scubbo.myprojectname.EchoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>EchoServlet</servlet-name>
        <url-pattern>/echo</url-pattern>
    </servlet-mapping>
</web-app>

src/main/java/org/scubbo/myprojectname/EchoServlet.java

package org.scubbo.myprojectname;

import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
import org.scubbo.myprojectname.sockets.EchoSocket;

public class EchoServlet extends WebSocketServlet {

    @Override
    public void configure(WebSocketServletFactory factory) {
        factory.getPolicy().setIdleTimeout(10000);
        factory.register(EchoSocket.class);
    }

src/main/java/org/scubbo/myprojectname/sockets/EchoSocket.java

package org.scubbo.myprojectname.sockets;

import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
import org.eclipse.jetty.websocket.api.annotations.WebSocket;

@WebSocket
public class EchoSocket {

    @OnWebSocketMessage
    public void onText(Session session, String message) {
        if (session.isOpen()) {
            System.out.printf("Echoing back message [%s]%n", message);
            session.getRemote().sendString(message, null);
        }
    }

}

【问题讨论】:

  • 您正在针对 3.1 进行编译,这就是它编译的方式 - 但是您的 Jetty 实现是哪个版本的 servlet API?
  • 您可能想阅读eclipse.org/jetty/documentation/current/what-jetty-version.html,然后检查您使用的是哪个版本的 Jetty。 (您似乎正在针对 9.3.2 进行编译,但我建议您检查日志以确定。)
  • eclipse.org/jetty/documentation/current/jetty-javaee.html 建议 Jetty 9.1.x 应该包含 Servlet Specification API 3.1。我将删除其他两个 Jetty 依赖项,仅依赖 jetty-all:9.1.3,然后重试。
  • 我担心我之前提到的文档页面甚至没有提到 9.1 - 您可能想跳到 9.2 或 9.3...
  • 好的!更新到 jetty-all:9.3.2.v20150730,我收到一个新错误 - “javax.servlet.ServletException:未在 Jetty 上运行,WebSocket 支持不可用”。根据此处的第三段 (eclipse.org/jetty/documentation/current/…),WebSockets 只能从 Jetty 容器内部使用 - 但 JettyRun (docs.gradle.org/current/dsl/…) 的规范表明它会这样做(“将展开的 Web 应用程序部署到嵌入式 Jetty网络容器”)。我会继续挖掘......

标签: java servlets gradle jetty servlet-3.0


【解决方案1】:

您遇到的最初问题是您的类路径中有 2 个相互冲突的 servlet api 版本(这并不罕见,因为该工件有六个奇数的 maven 坐标,这使得 maven 或 gradle 难以解决冲突)

不要在您的项目中使用 jetty-all,该工件不适合在项目中使用。见past responses about this

您在 WebSocket 支持方面遇到的问题应作为单独的问题提交到 stackoverflow 上。

就您的 websocket 问题提出一个具体问题,我会在那里回答。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2017-09-24
    • 2014-06-07
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    相关资源
    最近更新 更多