使用Smack 4.1的XMPP客户端在登录期间给出NullPointerException

我正在尝试使用Smack 4.1.0-rc3来实现连接到ejabberd xmpp服务器的java xmpp客户端。 我使用以下代码连接到服务器。

XMPPTCPConnectionConfiguration connConfig = XMPPTCPConnectionConfiguration .builder() .setServiceName("example.com") .setHost("192.168.56.101") .setPort(5222) .setCompressionEnabled(false) .setSecurityMode(SecurityMode.disabled) .setHostnameVerifier(new HostnameVerifier() { public boolean verify(String arg0, SSLSession arg1) { return true; } }) .setUsernameAndPassword(user, pass).build(); connection = new XMPPTCPConnection(connConfig); connection.connect(); connection.login(); 

执行’connection.login()’时,我得到以下NullPointerException。

 Exception in thread "main" java.lang.NullPointerException at org.jivesoftware.smack.util.stringencoder.Base64.encode(Base64.java:64) at org.jivesoftware.smack.util.stringencoder.Base64.encode(Base64.java:60) at org.jivesoftware.smack.util.stringencoder.Base64.encodeToString(Base64.java:42) at org.jivesoftware.smack.sasl.SASLMechanism.authenticate(SASLMechanism.java:199) at org.jivesoftware.smack.sasl.SASLMechanism.authenticate(SASLMechanism.java:169) at org.jivesoftware.smack.SASLAuthentication.authenticate(SASLAuthentication.java:236) at org.jivesoftware.smack.tcp.XMPPTCPConnection.loginNonAnonymously(XMPPTCPConnection.java:365) at org.jivesoftware.smack.AbstractXMPPConnection.login(AbstractXMPPConnection.java:452) at org.jivesoftware.smack.AbstractXMPPConnection.login(AbstractXMPPConnection.java:410) at org.org.oodlezz.unio.jabber.client.XmppClient.connect(XmppClient.java:88) at org.org.oodlezz.unio.jabber.client.Client.main(Client.java:32) 

我在代码中做错了吗? 你能指点一下使用Smack 4.1.0-rc3的正确例子吗?

这个页面上的其他答案有部分答案,但尝试它们我弄清楚真正缺少的是对smack-java7库的依赖。 添加此依赖项会导致调用初始化程序,设置base64encoder,因此NullPointerException消失。

在Android上,用smack-android替换smack-java7。

您的代码没问题,但可能需要正确的依赖项,您可以将它放在pom.xml文件中

   org.igniterealtime.smack smack-java7 4.1.1   org.igniterealtime.smack smack-tcp 4.1.1   org.igniterealtime.smack smack-im 4.1.1   org.igniterealtime.smack smack-extensions 4.1.1   

这基于: https : //github.com/igniterealtime/Smack/wiki/Smack-4.1-Readme-and-Upgrade-Guide

你可以把你需要的smack版本。

关于maven中的一些第一步,如果你不熟悉它,这可能对你有用: https : //maven.apache.org/guides/getting-started/maven-in-five-minutes.html

希望对你有所帮助!

正如Stephen Base64encoder所建议的那样,因为它没有被设置,所以确实是空的。 要初始化您必须在项目中包含smack-java7模块。

在连接之前你必须初始化smack使用,

 new Java7SmackInitializer().initialize(); 

对于Android,我相信你可以实现这个,

 new AndroidSmackInitializer().initialize(); 

我正在使用4.1.0-rc3。 就我而言,我没有遇到NPE。 该示例有效。

以下是pom.xml的一部分。

的pom.xml

  4.1.0-rc3  ...   org.igniterealtime.smack smack-core ${smack.version}   org.igniterealtime.smack smack-tcp ${smack.version}   org.igniterealtime.smack smack-java7 ${smack.version}  ...  ... 

示例代码就是,

 AbstractXMPPConnection conn = new XMPPTCPConnection("xxx", "yyy", "zzz"); conn.connect(); conn.login(); 

删除这个:

编译“org.igniterealtime.smack:smack- java7 :4.1.4”

并添加这个:

编译“org.igniterealtime.smack:smack- android :4.1.4”

当互联网不可用时我得到空指针exception,我没有初始化与XMPP的任何连接。 所以,Base64没有在smack的任何地方初始化。 在这种情况下,我需要使用以下方法手动初始化SmackInitializer:

 new AndroidSmackInitializer().initialize(); // Add this single line for initialization 

这行在smack库中调用AndroidSmackInitializer类initialize():

 public class AndroidSmackInitializer implements SmackInitializer { @Override public List initialize() { SmackConfiguration.setDefaultHostnameVerifier(new StrictHostnameVerifier()); Base64.setEncoder(AndroidBase64Encoder.getInstance()); Base64UrlSafeEncoder.setEncoder(AndroidBase64UrlSafeEncoder.getInstance()); return null; } }