[英]XMPP client using Smack 4.1 giving NullPointerException during login
我正在尝试使用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文件中
<dependencies>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-java7</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-tcp</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-im</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-extensions</artifactId>
<version>4.1.1</version>
</dependency>
</dependencies>
这基于: 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所建议的那样,确实是null,因为它没有被设置。 要初始化您必须在项目中包含smack-java7模块。
在连接之前你必须初始化smack使用,
new Java7SmackInitializer().initialize();
对于Android,我相信你可以实现这个,
new AndroidSmackInitializer().initialize();
我正在使用4.1.0-rc3。 就我而言,我没有遇到NPE。 该示例有效。
以下是pom.xml的一部分。
的pom.xml
<properties>
<smack.version>4.1.0-rc3</smack.version>
</properties>
...
<dependencies>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-core</artifactId>
<version>${smack.version}</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-tcp</artifactId>
<version>${smack.version}</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-java7</artifactId>
<version>${smack.version}</version>
</dependency>
...
</dependencies>
...
示例代码就是,
AbstractXMPPConnection conn = new XMPPTCPConnection("xxx", "yyy", "zzz");
conn.connect();
conn.login();
我在Android上也有这个问题...我的问题是通过更改path/to/your/android-project/build.gradle
版本修复的...所以,在path/to/your/android-project/build.gradle
删除这个:
编译“org.igniterealtime.smack:smack-
java7
:4.1.4”
并添加这个:
编译“org.igniterealtime.smack:smack-
android
:4.1.4”
当互联网不可用时我得到空指针异常,我没有初始化与XMPP的任何连接。 所以,Base64没有在smack的任何地方初始化。 在这种情况下,我需要使用以下方法手动初始化SmackInitializer:
new AndroidSmackInitializer().initialize(); // Add this single line for initialization
这行在smack库中调用AndroidSmackInitializer类initialize():
public class AndroidSmackInitializer implements SmackInitializer {
@Override
public List<Exception> initialize() {
SmackConfiguration.setDefaultHostnameVerifier(new StrictHostnameVerifier());
Base64.setEncoder(AndroidBase64Encoder.getInstance());
Base64UrlSafeEncoder.setEncoder(AndroidBase64UrlSafeEncoder.getInstance());
return null;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.