Client XMPP utilisant Smack 4.1 donnant 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 la connexion 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 la connexion.login () ' je reçois la 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, s'il vous plaît, m'indiquer un bon exemple d'utilisation de Smack 4.1.0-rc3?

22
demandé sur Flow 2015-03-14 09:35:24

6 réponses

les autres réponses sur cette page ont des parties de la réponse, mais en les essayant j'ai compris ce qui manque vraiment est la dépendance à la bibliothèque smack-java7. L'ajout de cette dépendance provoque l'appel des initialiseurs, la mise en place du codeur base64enc, et donc cette NullPointerException disparaît.

sur Android, remplacer smack-java7 par smack-android.

33
répondu Noam Ben Ari 2015-05-18 12:10:17

votre code est OK, mais peut-être avez-vous besoin des dépendances correctes, vous pouvez le mettre sur votre pom.fichier 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 certaines mesures dans maven si vous n'êtes pas familier avec elle, cela pourrait être utile pour vous: https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

Espérons que cette aide!

5
répondu jmmorlesin 2015-06-12 15:38:36

Comme suggéré par Etienne Base64encoder est en effet null parce qu'il n'est pas défini. Pour initialiser que vous devez inclure le module smack-java7 dans votre projet.

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

new Java7SmackInitializer().initialize();
new AndroidSmackInitializer().initialize();
3
répondu Abhishek Patidar 2017-05-23 12:02:29

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

La suite est la partie de la 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
répondu cybaek 2015-03-19 09:57:45

supprimer ceci :

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

et d'ajouter ceci :

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

0
répondu Richi 2016-08-30 18:04:06

j'obtiens l'exception du pointeur null quand internet n'est pas disponible et je n'initialise aucune connexion avec XMPP. Donc, Base64 ne pas initialiser à partir de n'importe où dans smack. Dans cette situation, je dois initialiser manuellement SmackInitializer en utilisant ceci:

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

cette ligne appelle la classe AndroidSmackInitializer 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
répondu SANAT 2017-02-28 06:40:16