NoSuchMethodError HttpServletRequest.getServletContext() в сервлете>3.0

Я пытаюсь настроить WebSocketServlet в Jetty.

Я настроил сервлет в соответствии с этим руководством и внедрил WebSocket в соответствии с этим. Тем не менее, когда я бегу gradle jettyRun и попытаться открыть соединение (используя это) для ws://localhost:8080/myProjectName/echo), Я получил java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.getServletContext() ( полная трассировка стека)

Я вижу, что этот метод был введен только в сервлете 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 / Главный / 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 / Основной / Java / орг / 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 / Основной / Java / орг / scubbo / myprojectname / розетки /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);
        }
    }

}

1 ответ

Решение

Исходная проблема, с которой вы столкнулись, заключается в том, что в вашем пути к классам было 2 конфликтующих версии API сервлета (не так уж редко, поскольку для этого артефакта существует полдюжины нечетных координат maven, что затрудняет разрешение конфликтов для maven или gradle)

Не используйте Jetty-all с вашим проектом, этот артефакт не предназначен для использования в проекте. Смотрите прошлые отзывы об этом.

Проблема, с которой вы сталкиваетесь при поддержке WebSocket, должна быть задана как отдельный вопрос по stackru.

Задайте конкретный вопрос о вашей проблеме с веб-сокетом, и я отвечу там.

Другие вопросы по тегам