복붙노트

[MONGODB] MongoDB를 3.x를 드라이버 안드로이드 호환성

MONGODB

MongoDB를 3.x를 드라이버 안드로이드 호환성

나는 MongoDB의 모든 인스턴스에 연결하는 자바 MongoDB의 드라이버 3.0.3를 사용하는 안드로이드 응용 프로그램을 개발하고 있어요.

일반적인 인스턴스에 커넥터 코드는 다음과 같습니다

try{
    MongoCredential credential = MongoCredential.createCredential(user, dbname, pass.toCharArray());
    MongoClient mongoClient = new MongoClient( new ServerAddress(server , port ), Arrays.asList(credential));
    MongoDatabase db = mongoClient.getDatabase(dbname);
    System.out.println("Connect to database successfully ");
    Iterator i= mongoClient.listDatabaseNames().iterator();
    while (i.hasNext()){
        Log.d("DATABASE", (String) i.next());
    }
    Iterator ic= db.listCollectionNames().iterator();
    while (ic.hasNext()){
        Log.d("COLLECTION", (String) ic.next());
    }
}catch(Exception e){
    System.err.println( e.getClass().getName() + ": " + e.getMessage() );
}

런타임에 좀 오류가 있습니다 :

이와 루프를 생성한다 :

누구든지 솔루션을? 자바 / 랭 / 관리 /있다 ManagementFactory 안드로이드 존재하지 않는 것, 당신은 어떻게 해결할 수 있습니까? 이 문제의 중심합니다.

사전, 마테오 감사

PS : 전체 로그는 다음과 같습니다

09-11 19:13:50.898    7418-7418/it.mysite.mongodbviewer W/org.bson.ObjectId﹕ Failed to get process identifier from JMX, using random number instead
java.lang.NoClassDefFoundError: Failed resolution of: Ljava/lang/management/ManagementFactory;
at org.bson.types.ObjectId.createProcessIdentifier(ObjectId.java:502)
at org.bson.types.ObjectId.<clinit>(ObjectId.java:460)
at com.mongodb.connection.ClusterId.<init>(ClusterId.java:47)
at com.mongodb.connection.DefaultClusterFactory.create(DefaultClusterFactory.java:40)
at com.mongodb.Mongo.createCluster(Mongo.java:660)
at com.mongodb.Mongo.createCluster(Mongo.java:646)
at com.mongodb.Mongo.<init>(Mongo.java:275)
at com.mongodb.MongoClient.<init>(MongoClient.java:184)
at com.mongodb.MongoClient.<init>(MongoClient.java:160)
at it.mysite.mongodbmanager.data.MongoDBDriver.connect(MongoDBDriver.java:102)
at it.mysite.mongodbmanager.fragments.MongoDBAccountDetailFragment.onClick(MongoDBAccountDetailFragment.java:101)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19865)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
 Caused by: java.lang.ClassNotFoundException: Didn't find class "java.lang.management.ManagementFactory" on path: DexPathList[[zip file "/data/app/it.mysite.mongodbviewer-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
    at org.bson.types.ObjectId.createProcessIdentifier(ObjectId.java:502)
    at org.bson.types.ObjectId.<clinit>(ObjectId.java:460)
    at com.mongodb.connection.ClusterId.<init>(ClusterId.java:47)
    at com.mongodb.connection.DefaultClusterFactory.create(DefaultClusterFactory.java:40)
    at com.mongodb.Mongo.createCluster(Mongo.java:660)
    at com.mongodb.Mongo.createCluster(Mongo.java:646)
    at com.mongodb.Mongo.<init>(Mongo.java:275)
    at com.mongodb.MongoClient.<init>(MongoClient.java:184)
    at com.mongodb.MongoClient.<init>(MongoClient.java:160)
    at it.mysite.mongodbmanager.data.MongoDBDriver.connect(MongoDBDriver.java:102)
    at it.mysite.mongodbmanager.fragments.MongoDBAccountDetailFragment.onClick(MongoDBAccountDetailFragment.java:101)
    at android.view.View.performClick(View.java:4780)
    at android.view.View$PerformClick.run(View.java:19865)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5254)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Suppressed: java.lang.ClassNotFoundException: java.lang.management.ManagementFactory
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 22 more
 Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
09-11 19:13:50.901    7418-7418/it.mysite.mongodbviewer I/cluster﹕ Cluster created with settings {hosts=[192.168.1.74:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
09-11 19:13:50.918    7418-7418/it.mysite.mongodbviewer I/System.out﹕ Connect to database successfully
09-11 19:13:50.924    7418-7418/it.mysite.mongodbviewer I/cluster﹕ No server chosen by ReadPreferenceServerSelector{readPreference=primary} from cluster description ClusterDescription{type=UNKNOWN, connectionMode=SINGLE, all=[ServerDescription{address=192.168.1.74:27017, type=UNKNOWN, state=CONNECTING}]}. Waiting for 30000 ms before timing out
09-11 19:13:50.954    7418-7487/it.mysite.mongodbviewer I/art﹕ Rejecting re-init on previously-failed class java.lang.Class<com.mongodb.connection.ScramSha1Authenticator$ScramSha1SaslClient>
09-11 19:13:50.954    7418-7487/it.mysite.mongodbviewer I/art﹕ Rejecting re-init on previously-failed class java.lang.Class<com.mongodb.connection.ScramSha1Authenticator$ScramSha1SaslClient>
09-11 19:13:50.955    7418-7487/it.mysite.mongodbviewer I/art﹕ Rejecting re-init on previously-failed class java.lang.Class<com.mongodb.connection.ScramSha1Authenticator$ScramSha1SaslClient>
09-11 19:13:50.956    7418-7487/it.mysite.mongodbviewer I/cluster﹕ Exception in monitor thread while connecting to server 192.168.1.74:27017
com.mongodb.MongoException: java.lang.NoClassDefFoundError: com.mongodb.connection.ScramSha1Authenticator$ScramSha1SaslClient
at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:125)
at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:127)
at java.lang.Thread.run(Thread.java:818)
 Caused by: java.lang.NoClassDefFoundError: com.mongodb.connection.ScramSha1Authenticator$ScramSha1SaslClient
at com.mongodb.connection.ScramSha1Authenticator.createSaslClient(ScramSha1Authenticator.java:61)
at com.mongodb.connection.SaslAuthenticator.authenticate(SaslAuthenticator.java:42)
at com.mongodb.connection.DefaultAuthenticator.authenticate(DefaultAuthenticator.java:32)
at com.mongodb.connection.InternalStreamConnectionInitializer.authenticateAll(InternalStreamConnectionInitializer.java:99)
at com.mongodb.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:44)
at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:115)
at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:127)
at java.lang.Thread.run(Thread.java:818)
09-11 19:13:51.479    7418-7487/it.mysite.mongodbviewer I/art﹕ Rejecting re-init on previously-failed class java.lang.Class<com.mongodb.connection.ScramSha1Authenticator$ScramSha1SaslClient>
09-11 19:13:52.106    7418-7487/it.mysite.mongodbviewer I/art﹕ Rejecting re-init on previously-failed class java.lang.Class<com.mongodb.connection.ScramSha1Authenticator$ScramSha1SaslClient>
09-11 19:13:52.637    7418-7487/it.mysite.mongodbviewer I/art﹕ Rejecting re-init on previously-failed class java.lang.Class<com.mongodb.connection.ScramSha1Authenticator$ScramSha1SaslClient>

해결법

  1. ==============================

    1.ManagementFactory에서 빨간 청어는 드라이버 캐치로, 그 예외는 대신 임의의 번호를 사용하여 다시 폭포처럼 그것은 나에게 보인다.

    ManagementFactory에서 빨간 청어는 드라이버 캐치로, 그 예외는 대신 임의의 번호를 사용하여 다시 폭포처럼 그것은 나에게 보인다.

    진짜 문제는 드라이버의 요구 달아나-SHA-1,하는 수입 다음 클래스의 구현을 인증 할 것으로 보인다 :

    import javax.crypto.Mac;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.PBEKeySpec;
    import javax.crypto.spec.SecretKeySpec;
    import javax.security.sasl.SaslClient;
    import javax.security.sasl.SaslException;
    

    나는이 자바 런타임 환경의 완전한 구현되지 안드로이드 플랫폼에서 사용할 수 없습니다 용의자.

    당신이 시도 할 수있는 것은 운전자의 인증 구현은 java.security.MessageDigest의에 의존하는에, MongoDB를 2.6에 대해 실행하는 것입니다.

    또 다른 한가지는 대한 데이터베이스와의 모든 상호 작용을 프록시를 담당하는 모바일 앱과 MongoDB를 사이에 REST 서비스를 가하고 생각합니다. 나머지 응용 프로그램은 MongoDB의 드라이버가 완벽하게 작동 될 것입니다 환경에서 실행할 수 있습니다.

  2. ==============================

    2.안드로이드에 사용 github.com/mongodb/mongo-java-driver 원하는 누군가를 위해, 나는 해결책을 가지고!

    안드로이드에 사용 github.com/mongodb/mongo-java-driver 원하는 누군가를 위해, 나는 해결책을 가지고!

    나는 ufficial github.com/mongodb/mongo-java-driver에서 포크와 안드로이드에 수정 javax.security.sasl의에 github.com/koterpillar/android-sasl에서 클래스를 통합했습니다.

    중요 : 없음 드라이버 비동기은 java.nio.channels.AsynchronousSocketChannel 안드로이드에 존재하지 않기 때문에 이식되지 않고있는 포팅이 존재하지 않습니다.

    그 결과는 https://github.com/matfur92/mongo-java-driver에서 다운로드 할 수있는 잘 동작하는 동기 MongoDB를 안드로이드 (자바) 드라이버

    LAST UPDATE (2015년 11월 5일) : 3.2.0-SNAPSHOT -> https://github.com/matfur92/mongo-java-driver/blob/gh-pages/JARs/mongo-java-driver-3.2.0- SNAPSHOT.jar? 원 = 사실

  3. ==============================

    3.REST 서비스 해결 방법이 아니다, 나는 인스턴스를 MongoDB를 직접 연결해야합니다.

    REST 서비스 해결 방법이 아니다, 나는 인스턴스를 MongoDB를 직접 연결해야합니다.

    편집하다:

    동기화 몽고 - 자바 드라이버가 올바르게 포팅 안드로이드에 포팅 : https://github.com/matfur92/mongo-java-driver

    java.nio.channels.AsynchronousSocketChannel 안드로이드에 존재하지 않는 및 포팅이 존재하지 않기 때문에 어떤 드라이버 비동기은 이식하지 않습니다.

    사람이 드라이버 비동기 작업이 제발 말해 얻을 수있는 솔루션을 제공합니다. 문제는 안드로이드 존재하지 않는 것이 java.nio.channels.AsynchronousSocketChannel에

  4. from https://stackoverflow.com/questions/32529484/mongodb-3-x-driver-android-compatibility by cc-by-sa and MIT license