web-dev-qa-db-ja.com

ログイン中にNullPointerExceptionを与えるSmack4.1を使用するXMPPクライアント

Ejabberdxmppサーバーに接続するJava xmppクライアントを実装するためにSmack4.1.0-rc3を使用しようとしています。サーバーに接続するために次のコードを使用しています。

    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)

コードで何か問題がありますか? Smack4.1.0-rc3を使用するための適切な例を教えてください。

23
Deepu

このページの他の回答には回答の一部がありますが、それらを試してみると、本当に欠けているのはsmack-Java7ライブラリへの依存であることがわかりました。この依存関係を追加すると、初期化子が呼び出され、base64encoderが設定されるため、このNullPointerExceptionは表示されなくなります。

Androidでは、smack-Java7をsmack-Androidに置き換えます。

34
Noam Ben Ari

コードは問題ありませんが、正しい依存関係が必要な場合があります。これを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

必要なバージョンのスマックを置くことができます。

Mavenに慣れていない場合の最初のステップについては、次のようにすると便利です。 https://maven.Apache.org/guides/getting-started/maven-in-five-minutes.html

これがお役に立てば幸いです。

5
jmmorlesin

Stephen が示唆しているように、Base64encoderは設定されていないため、実際にnullになります。プロジェクトにsmack-Java7モジュールを含める必要があることを初期化するには。

接続する前に、を使用してスマックを初期化する必要があります。

new Java7SmackInitializer().initialize();

Androidの場合、次を使用してそれを達成できると思います。

new AndroidSmackInitializer().initialize();
3

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

私もAndroidでこの問題を抱えていました...私の問題はライブラリを変更することで修正されましたAndroidバージョン...だから、path/to/your/Android-project/build.gradleこれを削除します:

コンパイル "org.igniterealtime.smack:smack -Java7:4.1.4 "

そしてこれを追加します:

「org.igniterealtime.smack:smack-Android:4.1.4」をコンパイルします

1
Richi

インターネットが利用できず、XMPPとの接続を初期化していない場合、nullポインター例外が発生します。そのため、Base64はsmackのどこからでも初期化されません。この状況では、これを使用してSmackInitializerを手動で初期化する必要があります。

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

smackライブラリのAndroidSmackInitializerクラスinitialize()を呼び出すこの行:

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