spark library igniterealtime java xmpp ejabberd smack

java - library - Cliente XMPP usando Smack 4.1 dando NullPointerException durante el inicio de sesión



spark openfire (6)

Estoy usando 4.1.0-rc3. En mi caso, no conocí NPE. El ejemplo funciona.

La siguiente es la parte 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 código de ejemplo es solo,

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

Estoy tratando de usar Smack 4.1.0-rc3 para implementar un cliente java xmpp que se conecta a un servidor ejabberd xmpp. Estoy usando el siguiente código para conectarme al servidor.

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

Al ejecutar el ''connection.login ()'' obtengo la siguiente excepción 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)

¿Estoy haciendo algo mal en el código? ¿Me podría indicar un ejemplo adecuado para usar Smack 4.1.0-rc3?


Las otras respuestas en esta página tienen partes de la respuesta, pero al probarlas, descubrí que lo que realmente falta es la dependencia de la biblioteca smack-java7. La adición de esta dependencia hace que se llamen los inicializadores, que se establezca el codificador base64, por lo que esta excepción NullPointerException desaparece.

En Android, reemplaza smack-java7 con smack-android.


Recibo una excepción de puntero nulo cuando Internet no está disponible y no estoy inicializando ninguna conexión con XMPP. Por lo tanto, Base64 no se inicializa desde cualquier lugar en smack. En esta situación, necesito inicializar manualmente SmackInitializer usando esto:

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

esta línea que llama a AndroidSmackInitializer Class initialize () en la biblioteca de 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; } }


Según lo sugerido por Stephen Base64encoder, de hecho viene nulo porque no está configurado. Para inicializar, debe incluir el módulo smack-java7 en su proyecto.

Antes de conectarte tienes que inicializar smack usando,

new Java7SmackInitializer().initialize();

Para Android, creo que puedes lograr eso usando,

new AndroidSmackInitializer().initialize();


Su código está bien, pero tal vez necesite las dependencias correctas, puede poner esto en su archivo 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>

Esto se basa en: https://github.com/igniterealtime/Smack/wiki/Smack-4.1-Readme-and-Upgrade-Guide

Puedes poner la versión de bofetada que necesites.

Acerca de algunos primeros pasos en maven si no está familiarizado con esto, esto podría ser útil para usted: https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

Espero que esta ayuda!


quita esto :

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

y añade esto:

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