webentwicklung-frage-antwort-db.com.de

XMPP-Client, der Smack 4.1 verwendet, gibt während der Anmeldung NullPointerException aus

Ich versuche, Smack 4.1.0-rc3 zum Implementieren eines Java-Xmpp-Clients zu verwenden, der eine Verbindung zu einem Ejabberd-Xmpp-Server herstellt. Ich verwende den folgenden Code für die Verbindung zum Server.

    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();

Während der Ausführung von 'connection.login ()' erhalte ich die folgende 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)

Mache ich etwas falsch im Code? Können Sie mich bitte auf ein gutes Beispiel für die Verwendung von Smack 4.1.0-rc3 hinweisen?

22
Deepu

Die anderen Antworten auf dieser Seite haben Teile der Antwort, aber beim Versuch herauszufinden, was wirklich fehlt, ist die Abhängigkeit von der smack-Java7-Bibliothek. Durch das Hinzufügen dieser Abhängigkeit werden die Initialisierer aufgerufen, der base64encoder festgelegt, sodass diese NullPointerException verschwindet.

Ersetzen Sie unter Android smack-Java7 durch smack-Android.

33
Noam Ben Ari

Ihr Code ist in Ordnung, aber möglicherweise benötigen Sie die richtigen Abhängigkeiten. Sie können dies in Ihre pom.xml-Datei einfügen

<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>

Dies basiert auf: https://github.com/igniterealtime/Smack/wiki/Smack-4.1-Readme-and-Upgrade-Guide

Sie können die Version von smack einsetzen, die Sie benötigen.

Wenn Sie sich mit den ersten Schritten nicht auskennen, könnte dies für Sie nützlich sein: https://maven.Apache.org/guides/getting-started/maven-in-five-minutes.html

Hoffe das diese Hilfe hilft!

5
jmmorlesin

Wie von Stephen Base64encoder vorgeschlagen, kommt er tatsächlich zu Null, da er nicht gesetzt wird. Um dies zu initialisieren, müssen Sie das smack-Java7-Modul in Ihr Projekt aufnehmen.

Bevor Sie eine Verbindung herstellen, müssen Sie smack mit

new Java7SmackInitializer().initialize();

Für Android glaube ich, dass Sie dies erreichen können,

new AndroidSmackInitializer().initialize();
3

Ich verwende 4.1.0-rc3. In meinem Fall habe ich NPE nicht getroffen. Das Beispiel funktioniert.

Das Folgende ist der Teil von 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>
...

Ein Beispielcode ist nur

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

conn.connect();
conn.login();
1
cybaek

entferne das :

kompiliere "org.igniterealtime.smack: smack -Java7: 4.1.4"

und füge folgendes hinzu:

kompiliere "org.igniterealtime.smack: smack -Android: 4.1.4"

0
Richi

Ich bekomme eine Ausnahme mit dem Nullzeiger, wenn das Internet nicht verfügbar ist und ich keine Verbindung mit XMPP initiiere. Daher kann Base64 nicht von überall aus initialisiert werden. In dieser Situation muss SmackInitializer manuell folgendermaßen initialisiert werden:

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

diese Zeile ruft die AndroidSmackInitializer-Klasse initialize () in der smack-Bibliothek auf:

public class AndroidSmackInitializer implements SmackInitializer {

    @Override
    public List<Exception> initialize() {
        SmackConfiguration.setDefaultHostnameVerifier(new StrictHostnameVerifier());
        Base64.setEncoder(AndroidBase64Encoder.getInstance());
        Base64UrlSafeEncoder.setEncoder(AndroidBase64UrlSafeEncoder.getInstance());
        return null;
    }

} 
0
SANAT