【问题标题】:Jetty, websockets and java.lang.NoSuchMethodError码头、websockets 和 java.lang.NoSuchMethodError
【发布时间】:2013-09-26 15:31:15
【问题描述】:

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

但是因为我在我的 camel-context.txt 中设置了一个 WebSocket:

<to uri="ws:JettyAlarmEndpoint"/>

我在 Jetty 控制台中出现此错误:

[                          main] ContextLoader                  ERROR Context initialization failed
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [META-INF/spring/camel-context.xml]; nested exception is org.springfr
amework.beans.FatalBeanException: Invalid NamespaceHandler class [org.apache.camel.spring.handler.CamelNamespaceHandler] for namespace [http://camel.apache.org/schema/spring]: problem with handler cla
ss file or dependent class; nested exception is java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.arrayFormat(Ljava/lang/String;[Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:412)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)

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

    }

}

我已经阅读了很多关于类路径中缺少 .jar 的论坛,当我打开 lib .jar 时,我的类路径中出现了“缺少的方法”。

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

你有什么想法吗???

【问题讨论】:

标签: websocket jetty


【解决方案1】:

您的类路径中有多个 slf4j jar。可能版本不匹配。

这已在 Stack Overflow 中得到解答:Exception thrown while using logback/slf4j

【讨论】:

  • 我有 3 个与日志相关的 .jar:- log4j-1.2.16 - slf4j-api-1.6.1 - slf4j-log4j12-1.6.4
  • 您的版本不匹配。 slf4j-api.jarslf4j-log4j12.jar 应该相互匹配。你应该使用 slf4j-log4j12.jar 构建的 log4j.jar 版本。有效配对示例:slf4j-api-1.6.6.jar + slf4j-log4j12-1.6.6.jar + log4j-1.2.17.jar。 (我只是使用了 search.maven.org 中的信息找到了这个)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 2012-02-21
  • 1970-01-01
  • 2015-06-19
  • 2012-06-19
相关资源
最近更新 更多