web-dev-qa-db-fra.com

Client XMPP utilisant Smack 4.1 donnant une exception NullPointerException lors de la connexion

J'essaie d'utiliser Smack 4.1.0-rc3 pour implémenter un client Java xmpp qui se connecte à un serveur ejabberd xmpp. J'utilise le code suivant pour me connecter au serveur.

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

Lors de l'exécution de 'connection.login ()', j'obtiens l'exception NullPointerException suivante. 

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)

Est-ce que je fais quelque chose de mal dans le code? Pouvez-vous m'indiquer un exemple approprié d'utilisation de Smack 4.1.0-rc3?

22
Deepu

Les autres réponses sur cette page ont une partie de la réponse, mais en les essayant, j'ai compris que ce qui manque vraiment, c'est la dépendance à la bibliothèque smack-Java7. L'ajout de cette dépendance entraîne l'appel des initialiseurs, le paramétrage de base64encoder et la suppression de cette exception NullPointerException.

Sur Android, remplacez smack-Java7 par smack-Android.

33
Noam Ben Ari

Votre code est OK, mais peut-être avez-vous besoin des dépendances correctes, vous pouvez le mettre sur votre fichier 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>

Ceci est basé sur: https://github.com/igniterealtime/Smack/wiki/Smack-4.1-Readme-and-Upgrade-Guide

Vous pouvez mettre la version de smack dont vous avez besoin.

À propos de quelques premières étapes de maven si cela ne vous est pas familier, cela pourrait vous être utile: https://maven.Apache.org/guides/getting-started/maven-in-five-minutes.html

J'espère que cette aide!

5
jmmorlesin

Comme suggéré par Stephen Base64encoder est en train de devenir nul car il n’est pas défini. Pour initialiser cela, vous devez inclure le module smack-Java7 dans votre projet.

Avant de vous connecter, vous devez initialiser smack en utilisant,

new Java7SmackInitializer().initialize();

Pour Android, je pense que vous pouvez y parvenir en utilisant,

new AndroidSmackInitializer().initialize();
3
Abhishek Patidar

J'utilise 4.1.0-rc3. Dans mon cas, je n'ai pas rencontré NPE. L'exemple fonctionne.

Ce qui suit est la partie de 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>
...

Un exemple de code est juste,

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

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

enlève ça : 

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

et ajoutez ceci: 

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

0
Richi

J'obtiens une exception de pointeur nulle lorsque Internet n'est pas disponible et je n'initialise aucune connexion avec XMPP. Donc, Base64 n'initialise pas de n'importe où dans smack Dans cette situation, j'ai besoin d'initialiser manuellement SmackInitializer en utilisant ceci:

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

cette ligne appelant AndroidSmackInitializer Class initialize () dans la bibliothèque smack:

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