Java Servlet上的NoSuchMethodError HttpServletRequest.getServletContext()函数>;3

Java Servlet上的NoSuchMethodError HttpServletRequest.getServletContext()函数>;3,java,servlets,gradle,jetty,servlet-3.0,Java,Servlets,Gradle,Jetty,Servlet 3.0,我正在尝试在Jetty中设置WebSocketServlet 我已经根据设置了一个servlet,并根据实现了WebSocket。但是,当我运行gradle jettyRun并尝试打开(使用)到ws://localhost:8080/myProjectName/echo)的连接时,我得到java.lang.NoSuchMethodError:javax.servlet.http.HttpServletRequest.getServletContext()() 我知道这个方法只是在Servlet3

我正在尝试在Jetty中设置WebSocketServlet

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

我知道这个方法只是在Servlet3.0中引入的-但是,因为我使用的是
ServletAPI: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/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);
        }
    }

}

您遇到的最初问题是在类路径中有两个相互冲突的ServletAPI版本(这并不少见,因为该工件有六个maven坐标,这使得maven或gradle很难解决冲突)

不要在您的项目中使用jetty all,该工件并不打算从项目中使用。看

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


问一个关于websocket问题的具体问题,我会在这里回答。

您是根据3.1进行编译的,3.1是如何编译的-但是您的Jetty实现了什么版本的servlet API?您可能需要阅读并检查您使用的Jetty版本。(您似乎是在根据9.3.2进行编译,但我建议您检查日志以确定。)建议Jetty 9.1.x应该包括Servlet规范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支持不可用”。根据这里的第三段(),WebSocket只能从Jetty容器内部获得,但是JettyRun()的规范建议它可以做到这一点(“将分解的web应用程序部署到嵌入式Jetty web容器”)。我会继续挖掘。。。
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);
        }
    }

}