Jetty、WebSocket和java.lang.NoSuchMethodError

Jetty、WebSocket和java.lang.NoSuchMethodError,websocket,jetty,Websocket,Jetty,我正在尝试在Jetty 8.1上运行Camel服务器。WebSocket运行正常,我可以在Init()方法中看到打印 但由于我在camel-context.txt中设置了WebSocket: <to uri="ws:JettyAlarmEndpoint"/> 例如:java.lang.NoSuchMethodError:org.slf4j.helpers.MessageFormatter.arrayFormat(Ljava/lang/String;[Ljava/lang/Objec

我正在尝试在Jetty 8.1上运行Camel服务器。WebSocket运行正常,我可以在Init()方法中看到打印

但由于我在camel-context.txt中设置了WebSocket:

<to uri="ws:JettyAlarmEndpoint"/>
例如:java.lang.NoSuchMethodError:org.slf4j.helpers.MessageFormatter.arrayFormat(Ljava/lang/String;[Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;

正如您所看到的,我的WebSocket很简单:

package com.thales.ktdscis.server;

import java.io.IOException;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.websocket.WebSocket;
import org.eclipse.jetty.websocket.WebSocket.OnTextMessage;
import org.eclipse.jetty.websocket.WebSocketServlet;

import com.thales.ktdscis.utils.JSONUtils;

/**
 * Servlet implementation class RiaWebSocket
 */
@WebServlet("/test")
public class JettyEndpoint extends WebSocketServlet {
    private static final long           serialVersionUID    = -1798046558917516877L;
    public static final boolean         DEBUG               = false;

    public final Set<ObserverWebSocket> users               = new CopyOnWriteArraySet<ObserverWebSocket>();

    @Override
    public void init() throws ServletException {
            System.out.println(" XXX JettyEndpoint().Init() XXX ");
        super.init();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

    @Override
    public WebSocket doWebSocketConnect(HttpServletRequest arg0, String arg1) {
        return new ObserverWebSocket(users);
    }

    public class ObserverWebSocket implements OnTextMessage {
        private Connection              connection;
        private Set<ObserverWebSocket>  users;

        public ObserverWebSocket(Set<ObserverWebSocket> users) {
            this.users = users;

        }

        public void onMessage(String message) {
            System.out.println("Message received : " + message);
            unicast(message);
        }

        private void unicast(String message) {
            try {
                this.connection.sendMessage(message);
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }

        private void broadcast(String message) {
            for (ObserverWebSocket user : users) {
                try {
                    user.connection.sendMessage(message);
                }
                catch (Exception e) {
                }
            }
        }

        @Override
        public void onOpen(Connection connection) {
            this.connection = connection;
            users.add(this);
        }

        @Override
        public void onClose(int closeCode, String message) {
            users.remove(this);
        }

    }

}
package com.thales.ktdscis.server;
导入java.io.IOException;
导入java.util.Set;
导入java.util.concurrent.CopyOnWriteArraySet;
导入javax.servlet.ServletException;
导入javax.servlet.annotation.WebServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入org.eclipse.jetty.websocket.websocket;
导入org.eclipse.jetty.websocket.websocket.OnTextMessage;
导入org.eclipse.jetty.websocket.WebSocketServlet;
导入com.thales.ktdscis.utils.JSONUtils;
/**
*Servlet实现类RiaWebSocket
*/
@WebServlet(“/test”)
公共类JettyEndpoint扩展WebSocketServlet{
私有静态最终长serialVersionUID=-1798046558917516877L;
公共静态最终布尔调试=false;
公共最终设置用户=新CopyOnWriteArraySet();
@凌驾
public void init()引发ServletException{
System.out.println(“XXX JettyEndpoint().Init()XXX”);
super.init();
}
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
}
@凌驾
公共WebSocket doWebSocketConnect(HttpServletRequest arg0,字符串arg1){
返回新的ObserverWebSocket(用户);
}
公共类ObserverWebSocket实现了OnTextMessage{
专用连接;
私人用户;
公共ObserverWebSocket(设置用户){
this.users=用户;
}
公共消息无效(字符串消息){
System.out.println(“收到的消息:+消息”);
单播(消息);
}
专用无效单播(字符串消息){
试一试{
this.connection.sendMessage(message);
}
捕获(IOE异常){
e、 printStackTrace();
}
}
专用无效广播(字符串消息){
for(ObserverWebSocket用户:用户){
试一试{
user.connection.sendMessage(消息);
}
捕获(例外e){
}
}
}
@凌驾
公共开放(连接){
这个连接=连接;
用户。添加(此);
}
@凌驾
public void onClose(int closeCode,字符串消息){
用户。删除(此);
}
}
}
我读过很多关于类路径中missing.jar的论坛,当我打开lib.jar时,我的类路径中有“missing方法”

我尝试过javax.WebSocket并导入org.eclipse.jetty.WebSocket.WebSocket。总是相同的错误。我想在每次调用“to”路由时在我的WebSocket中运行一个特定的方法。理想情况下,向客户列表发送一条消息


你知道吗?

你的类路径中有多个slf4j JAR。可能是版本不匹配


这一点在堆栈溢出中已经得到了回答:

我已经得到了与日志相关的3.jar的可能副本:-log4j-1.2.16-slf4j-api-1.6.1-slf4j-log4j12-1.6.4版本不匹配。
slf4j-api.jar
slf4j-log4j12.jar
应该相互匹配。您应该使用
log4j.jar
版本ode>slf4j-log4j12.jar是根据有效配对的示例构建的:
slf4j-api-1.6.6.jar
+
slf4j-log4j12-1.6.6.jar
+
log4j-1.2.17.jar
(我刚刚使用了search.maven.org中的信息来找到这个问题)
package com.thales.ktdscis.server;

import java.io.IOException;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.websocket.WebSocket;
import org.eclipse.jetty.websocket.WebSocket.OnTextMessage;
import org.eclipse.jetty.websocket.WebSocketServlet;

import com.thales.ktdscis.utils.JSONUtils;

/**
 * Servlet implementation class RiaWebSocket
 */
@WebServlet("/test")
public class JettyEndpoint extends WebSocketServlet {
    private static final long           serialVersionUID    = -1798046558917516877L;
    public static final boolean         DEBUG               = false;

    public final Set<ObserverWebSocket> users               = new CopyOnWriteArraySet<ObserverWebSocket>();

    @Override
    public void init() throws ServletException {
            System.out.println(" XXX JettyEndpoint().Init() XXX ");
        super.init();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

    @Override
    public WebSocket doWebSocketConnect(HttpServletRequest arg0, String arg1) {
        return new ObserverWebSocket(users);
    }

    public class ObserverWebSocket implements OnTextMessage {
        private Connection              connection;
        private Set<ObserverWebSocket>  users;

        public ObserverWebSocket(Set<ObserverWebSocket> users) {
            this.users = users;

        }

        public void onMessage(String message) {
            System.out.println("Message received : " + message);
            unicast(message);
        }

        private void unicast(String message) {
            try {
                this.connection.sendMessage(message);
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }

        private void broadcast(String message) {
            for (ObserverWebSocket user : users) {
                try {
                    user.connection.sendMessage(message);
                }
                catch (Exception e) {
                }
            }
        }

        @Override
        public void onOpen(Connection connection) {
            this.connection = connection;
            users.add(this);
        }

        @Override
        public void onClose(int closeCode, String message) {
            users.remove(this);
        }

    }

}