【问题标题】:Smack throws "Exception in thread "Smack Packet Reader (0)" java.lang.NoSuchMethodError: org.jivesoftware.smack.util.StringUtils.parseDate"Smack 在线程“Smack Packet Reader (0)”中抛出“异常”java.lang.NoSuchMethodError:org.jivesoftware.smack.util.StringUtils.parseDate”
【发布时间】:2014-10-31 07:37:59
【问题描述】:

我正在尝试从 App Server(TOMCAT) 创建多用户聊天组,我在 servlet 中创建了一个 XMPP 机器人。

根据我的要求,我必须从应用服务器创建一个多用户聊天组(在应用服务器上使用 xmpp bot),并从 android 应用加入用户。

创建多用户聊天组并从 Android 加入用户(使用 aSmack)工作得很好,当我尝试在 appServer(TOMCAT)上做同样的事情时,我收到错误,

起初,当我尝试创建 MUC 时,我收到“无法使用 Android 的 aSmack 库创建多用户聊天 (MUC) 房间:”packet.DefaultPacketExtension 无法转换为 packet.MUCUser”,

当我在 SO 上搜索时,我发现 POST @FLOW 提到了这个错误的原因

org.jivesoftware.smack.packet.DefaultPacketExtension 不能转换为 org.jivesoftware.smackx.packet.MUCUser 通常是一个指示符 您没有初始化负责处理的 aSmack 的静态代码 为各种数据包(和数据包)注册 Smack 提供程序 扩展)类的 Smack。 对于大多数 aSmack 版本,只需调用

SmackAndroid.init(Context ctx)

会成功的。

核心 Smack 包中没有这样的方法,它负责为 Smack 的各种数据包(和数据包扩展)类注册 Smack 提供程序。

所以我在这个 link 上使用 configure(ProviderManager pm) 方法手动配置提供

现在配置提供程序后,一切都应该可以正常工作,但我仍然无法创建 MUC 组

我的代码如下

    SmackConfiguration.setPacketReplyTimeout(packetReplyTimeout);

    if(service != null)
        config = new ConnectionConfiguration(server, port, service);
    else
        config = new ConnectionConfiguration(server, port);

    config.setSASLAuthenticationEnabled(true);
    config.setSecurityMode(SecurityMode.disabled);
    config.setDebuggerEnabled(true);
    connection = new XMPPConnection(config);
    connection.connect();

    System.out.println("Connected: " + connection.isConnected());
    chatManager = connection.getChatManager();
    messageListener = new MyMessageListener();

if (connection!=null && connection.isConnected()) {
        configure(ProviderManager.getInstance());
        connection.login(username, password);
    }
   MultiUserChat muc = new MultiUserChat(connection, "1234567@conference.localhost");

        muc.create("Jonny");

          Form form = muc.getConfigurationForm();
             Form submitForm = form.createAnswerForm();

            for (Iterator<FormField> fields = form.getFields(); fields.hasNext();) {
                FormField field = (FormField) fields.next();  
                if (!FormField.TYPE_HIDDEN.equals(field.getType())
                        && field.getVariable() != null) {
                   // show("field: " + field.getVariable());
                    // Sets the default value as the answer
                    submitForm.setDefaultAnswer(field.getVariable());
                }
            }

            List<String> owners = new ArrayList<String>();

            owners.add(xmppManager.getXmppConnection().getUser());
            submitForm.setAnswer("muc#roomconfig_roomowners", owners);
            //submitForm.setAnswer("muc#roomconfig_roomname", );
            submitForm.setAnswer("muc#roomconfig_persistentroom", true);
            muc.sendConfigurationForm(submitForm);
            muc.join(MucNick);
            muc.sendMessage("hello everybody");
            muc.addMessageListener(
                    new PacketListener() {
                        @Override
                        public void processPacket(Packet packet) {
                                message = (Message) packet;
                            if (message.getBody() != null) {
                                String fromName = StringUtils.parseBareAddress(message
                                        .getFrom());
                                System.out.println("andro xmpp client"+ "Text Recieved--" + message.getBody()
                                        + " from " + fromName );
                                //messages.add(fromName + ":");
                                //messages.add(message.getBody());
                                //infobox.append("message arrieved "+" from::"+message.getFrom()+"__"+message.getBody());

                                // Add the incoming message to the list view
                                //Log.i("andro xmpp client","group messages__"+ messages.toString());

                            }
                        }
                    }

                    );

这里是堆栈跟踪::

Exception in thread "Smack Packet Reader (0)" java.lang.NoSuchMethodError: org.jivesoftware.smack.util.StringUtils.parseDate(Ljava/lang/String;)Ljava/util/Date;
    at org.jivesoftware.smackx.provider.DelayInformationProvider.parseExtension(DelayInformationProvider.java:45)
    at org.jivesoftware.smack.util.PacketParserUtils.parsePacketExtension(PacketParserUtils.java:768)
    at org.jivesoftware.smack.util.PacketParserUtils.parsePresence(PacketParserUtils.java:248)
    at org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:232)
    at org.jivesoftware.smack.PacketReader.access$000(PacketReader.java:43)
    at org.jivesoftware.smack.PacketReader$1.run(PacketReader.java:70)
No response from server.: 
    at org.jivesoftware.smackx.muc.MultiUserChat.create(MultiUserChat.java:367)
    at com.sentiinel.egovern.testcase1.testing2.createMUC(testing2.java:510)
    at com.sentiinel.egovern.testcase1.testing2.insertRequest(testing2.java:303)
    at com.sentiinel.egovern.testcase1.testing2.doPost(testing2.java:133)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at com.sentiinel.filter.AuthenticationFilter.doFilter(AuthenticationFilter.java:115)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

对上述问题的任何帮助都会非常有帮助

提前致谢!!!

【问题讨论】:

    标签: java xmpp smack


    【解决方案1】:

    核心 Smack 包中没有这样的方法来处理 为各种数据包(和数据包)注册 Smack 提供程序 扩展)类的 Smack。

    是的(虽然不在 smack-core 中)。

    所以我使用 configure(ProviderManager) 手动配置提供 pm) 这个链接上的方法

    永远不要手动配置提供程序(至少不要,如果您不知道自己在做什么)。

    线程“Smack Packet Reader (0)”中的异常 java.lang.NoSuchMethodError: org.jivesoftware.smack.util.StringUtils.parseDate(Ljava/lang/String;)Ljava/util/Date; 在 org.jivesoftware.smackx.provider.DelayInformationProvider.parseExtension(DelayInformationProvider.java:45)

    您看到的是NoSuchmethodError。出于某种原因,StringUtils 中的parseDate 方法不存在,但DelayInformationProvider 除外。会不会是你在混合不同主要版本的 Smack 组件?您使用哪个 Smack 版本?

    【讨论】:

    • 我使用的是 smack 版本 3.2.2
    • 那个版本很老,而且有严重的错误。我推荐使用最新的稳定版本,目前是 Smack 4.0.4。
    • 是的,在读完你的回答后,虽然我使用的版本必须是旧的或过时的,所以我开始使用 4.0.4,我只使用 smack V-3.2.2,因为我必须实现 bosh应用程序服务器(TOMCAT)上的功能我可以使用 smack 3.2.2 的示例,但现在我可以使用 XMPPBOSHConnection 类进行 smack 连接,正如您在回答中所说,有可用于为各种数据包注册 Smack 提供程序的方法和您还建议“从不手动配置提供程序”,您能给我任何示例,我可以通过这些示例为各种软件包注册 Smack 提供程序。
    • 您只需要注册自定义提供程序,其他一切都将由 Smack 处理。
    • 如何注册自定义提供商??说群聊邀请 "ProviderManager.addExtensionProvider("x","jabber:x:conference", new GroupChatInvitation.Provider());"像这样???
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 2019-11-14
    相关资源
    最近更新 更多