Servlet> 3.0上的NoSuchMethodError HttpServletRequest.getServletContext() [英] NoSuchMethodError HttpServletRequest.getServletContext() on Servlet >3.0

查看:142
本文介绍了Servlet> 3.0上的NoSuchMethodError HttpServletRequest.getServletContext()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



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



参见这个方法仅在servlet 3.0中引入 - 但是,因为我使用 servlet-api:3.1.0

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




文件:

build.gradle:

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

sourceCompatibility = 1.5
version ='1.0'

存储库{
mavenCentral()
}

依赖关系{
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组:'junit',名称:'junit',版本: '4.11'
}



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

 <?xml version =1.0encoding =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_IDversion =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; 

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

public class EchoServlet extends WebSocketServlet {
$ b $ @Override
public void configure(WebSocketServletFactory factory){
factory.getPolicy()。setIdleTimeout(10000) ;
factory.register(EchoSocket.class);



$ s
$ src / main / java / org / scubbo / myprojectname / sockets / EchoSocket。 java

  package org.scubbo.myprojectname.sockets; 

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

@WebSocket
public class EchoSocket {

@OnWebSocketMessage $ b $ public void onText(Session session,String message){
if(session .isOpen()){
System.out.printf(回声消息[%s]%n,message);
session.getRemote()。sendString(message,null);



$ b


解决方案

你遇到的最初的问题是你的类路径中有2个相互冲突的servlet api版本(这并不罕见,因为这个工件有6个奇怪的maven坐标,这使得解决冲突对于maven或gradle很困难)

不要在项目中使用jetty-all,这个工件不能用于项目。请参阅过去对此的回应



你在使用WebSocket支持时遇到的问题应该作为一个单独的问题提交到stackoverflow。



询问有关websocket问题的具体问题,我会在那里回答。


I'm trying to set up a WebSocketServlet in Jetty.

I've set up a servlet according to this guide, and implemented the WebSocket according to this one. However, when I run gradle jettyRun and attempt to open a connection (using this) to ws://localhost:8080/myProjectName/echo), I get java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.getServletContext() (full stacktrace)

I see that this method was only introduced in servlet 3.0 - however, since I'm using servlet-api:3.1.0, I believe I should have that method?

I'm reasonably sure that the routing in my WEB-INF/web.xml is correct, since when I try to hit another url (ws://localhost:8080/myProjectName/echo123, for instance), I don't get error output on the terminal.


Files:

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);
        }
    }

}

解决方案

The original problem you are having is that you had 2 conflicting versions of the servlet api in your classpath (not that uncommon, as there's a half-dozen odd maven coordinates for that artifact, which makes conflict resolution difficult for maven or gradle)

Don't use jetty-all with your project, that artifact isn't meant to be used from a project. See past responses about this.

The problem you are having with WebSocket support should be filed as a separate question on stackoverflow.

Ask a specific question about your websocket issue, and I'll answer there.

这篇关于Servlet&gt; 3.0上的NoSuchMethodError HttpServletRequest.getServletContext()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆