Подтвердить что ты не робот

Клиент XMPP с использованием Smack 4.1, предоставляющий исключение NullPointerException во время входа в систему

Я пытаюсь использовать Smack 4.1.0-rc3 для реализации java xmpp-клиента, который подключается к серверу ejabberd xmpp. Я использую следующий код для подключения к серверу.

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

При выполнении 'connection.login()' я получаю следующее исключение 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)

Я делаю что-то неправильно в коде? Не могли бы вы указать на правильный пример использования Smack 4.1.0-rc3?

4b9b3361

Ответ 1

В других ответах на этой странице есть части ответа, но, пытаясь понять их, я понял, что действительно отсутствует, зависит от библиотеки smack-java7. Добавление этой зависимости заставляет инициализаторы быть вызваны, базовый 64encoder должен быть установлен, и поэтому это исключение NullPointerException исчезает.

На Android замените smack-java7 на smack-android.

Ответ 2

Ваш код в порядке, но, возможно, вам нужны правильные зависимости, вы можете поместить это в файл 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>

Это основано на: https://github.com/igniterealtime/Smack/wiki/Smack-4.1-Readme-and-Upgrade-Guide

Вы можете поставить версию Smack, которая вам нужна.

О некоторых первых шагах в Maven, если вы не знакомы с ним, это может быть полезно для вас: https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

Надеюсь, что это поможет!

Ответ 3

Как было предложено Stephen Base64encoder действительно имеет значение null, потому что его не устанавливают. Чтобы инициализировать, что вы должны включить модуль smack-java7 в свой проект.

Перед подключением вы должны инициализировать использование smack,

new Java7SmackInitializer().initialize();

Для Android, я считаю, что вы можете добиться этого,

new AndroidSmackInitializer().initialize();

Ответ 4

Я использую 4.1.0-rc3. В моем случае я не встречался с NPE. Пример работает.

Ниже приведена часть 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>
...

Пример кода просто,

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

conn.connect();
conn.login();

Ответ 5

У меня тоже была эта проблема на Android... Моя проблема была исправлена путем изменения версии библиотеки Android... Итак, на path/to/your/android-project/build.gradle удалите это:

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

и добавьте это:

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

Ответ 6

Я получаю исключение null-указателя, когда интернет недоступен, и я не инициализирую никакого соединения с XMPP. Итак, Base64 не инициализируется нигде в smack. В этой ситуации мне нужно вручную инициализировать SmackInitializer, используя это:

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

эта строка вызывает метод AndroidSmackInitializer Classizeize() в библиотеке 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;
    }

}