java - Servlet >3.0 上的 NoSuchMethodError HttpServletRequest.getServletContext()

标签 java servlets gradle jetty servlet-3.0

我正在尝试在 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 中的路由是正确的,因为当我尝试访问另一个网址 (ws://localhost:8080/myProjectName/echo123,例如),我在终端上没有收到错误输出。


文件:

构建.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);
        }
    }

}

最佳答案

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

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

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

询问有关您的 websocket 问题的具体问题,我会回答。

关于java - Servlet >3.0 上的 NoSuchMethodError HttpServletRequest.getServletContext(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32296856/

相关文章:

java - 我如何使用数组来制作随机圆圈

java - Request.getparameter 从输入中丢弃特殊字符

gradle - 无法创建 gradle 插件扩展的实例

gradle - java.io.IOException与Gradle

java - Gradle (java) : test task should use generated . jar 而不是类路径中的 .class 文件

java - 在Android BroadcastReceiver中使用Jsoup时如何解决 "UnsatisfiedLinkError"?

java - Selenium-IDE : Make a . java 文件在 FireFox 扩展中运行

java - 如何删除 @ManyToMany 关联(加入的链接)而不删除实际的目标实体

java - 如何从 Liferay-Portal、服务器的 http 响应字段中删除 http header ?

jsp - JspServlet中的 "mappedfile"参数代表什么?