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"