【发布时间】:2026-01-27 00:05:04
【问题描述】:
我正在尝试通过 android 意图中的 java 代码连接到 MongoDB - Atlas,代码发布在下面,但我遇到了有关连接字符串的错误:
public class MongoDBConnectionActivity extends AppCompatActivity {
private String url = "mongodb+srv://armand:[pasword]@cluster0.alzjc.mongodb.net/ism?retryWrites=true&w=majority";
private String db = "ism";
private String collection = "students";
TextView tV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mongo_d_b_connection);
tV = findViewById(R.id.textView4);
}
public void connectDB(View view) {
connect();
}
public void connect() {
MongoDBConnectionManager task = new MongoDBConnectionManager();
task.execute(new String[]{url,db,collection});
}
private class MongoDBConnectionManager extends AsyncTask<String, Void, Boolean> {
MongoClientURI uri;
MongoClient mongoClient;
MongoDatabase database;
MongoCollection<Document> coll;
private boolean result = false;
//ProgressBar pb = new ProgressBar(MongoDBConnectionActivity.this);
ProgressDialog pDialog = new ProgressDialog(MongoDBConnectionActivity.this);
@Override
protected void onPreExecute() {
pDialog.setMessage("Reading Data...");
pDialog.show();
}
@Override
protected Boolean doInBackground(String... strings) {
/*
MongoClientURI uri = new MongoClientURI("mongodb://username:password@www.example.com:12345/db-name" );
MongoClient mongoClient = new MongoClient(uri);
MongoDatabase db = mongoClient.getDatabase(uri.getDatabase());
*/
String url = strings[0];
String db = strings[1];
String collection = strings[2];
ExampleDialog dialog = new ExampleDialog(url,db,collection);
dialog.show(getSupportFragmentManager(), "example dialog");
try {
uri = new MongoClientURI(url);
mongoClient = new MongoClient(uri);
database = mongoClient.getDatabase(db);
coll = database.getCollection(collection);
Document first = coll.find().first();
tV.setText(first.toJson());
result = true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
@Override
protected void onPostExecute(Boolean result){
if(result)
pDialog.dismiss();
else
pDialog.setMessage("Error!");
}
/*
onPreExecute() -> Before background check ( like opening connection to the database we need to show something on screen
an animation like a progress bar
doInBackground(Params) -> here we start connection to the databases, Operations here should stay away from main thread
onProgressUpdate(Progress…) -> updating information Like the animation of the progress bar based
onPostExecute(Result) -> we updated the ui with the result
*/
}
}
这是错误:
W/System.err: java.lang.IllegalArgumentException: uri needs to start with mongodb://
W/System.err: at com.mongodb.ConnectionString.<init>(ConnectionString.java:196)
at com.mongodb.MongoClientURI.<init>(MongoClientURI.java:163)
at com.mongodb.MongoClientURI.<init>(MongoClientURI.java:150)
at com.example.helloworld.MongoDBConnectionActivity$MongoDBConnectionManager.doInBackground(MongoDBConnectionActivity.java:69)
at com.example.helloworld.MongoDBConnectionActivity$MongoDBConnectionManager.doInBackground(MongoDBConnectionActivity.java:42)
at android.os.AsyncTask$2.call(AsyncTask.java:316)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:255)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
W/System.err: at java.lang.Thread.run(Thread.java:776)
I/art: Do partial code cache collection, code=59KB, data=60KB
I/art: After code cache collection, code=59KB, data=60KB
我不明白为什么会返回此问题,因为在运行 java 程序时它工作得很好,而且我使用的连接器与我在 java 项目中使用的连接器相同,只是这里是通过使用 gradle 提供的:
implementation 'org.mongodb:mongo-java-driver:3.12.8'
如果我从连接字符串中删除 +srv 错误是巨大的:
W/art: Unresolved exception class when finding catch block: javax.naming.NamingException
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.example.helloworld, PID: 3802
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:330)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:255)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:776)
Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/naming/directory/InitialDirContext;
at com.mongodb.internal.dns.DefaultDnsResolver.createDnsDirContext(DefaultDnsResolver.java:150)
at com.mongodb.internal.dns.DefaultDnsResolver.resolveAdditionalQueryParametersFromTxtRecords(DefaultDnsResolver.java:112)
at com.mongodb.ConnectionString.<init>(ConnectionString.java:382)
at com.mongodb.MongoClientURI.<init>(MongoClientURI.java:257)
at com.mongodb.MongoClientURI.<init>(MongoClientURI.java:239)
at com.example.helloworld.MongoDBConnectionActivity$MongoDBConnectionManager.doInBackground(MongoDBConnectionActivity.java:69)
at com.example.helloworld.MongoDBConnectionActivity$MongoDBConnectionManager.doInBackground(MongoDBConnectionActivity.java:42)
at android.os.AsyncTask$2.call(AsyncTask.java:316)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:255)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:776)
Caused by: java.lang.ClassNotFoundException: Didn't find class "javax.naming.directory.InitialDirContext" on path: DexPathList[[zip file "/data/app/com.example.helloworld-1/base.apk"],nativeLibraryDirectories=[/data/app/com.example.helloworld-1/lib/arm64, /system/lib64, /vendor/lib64, /system/vendor/lib64, /product/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at com.mongodb.internal.dns.DefaultDnsResolver.createDnsDirContext(DefaultDnsResolver.java:150)
at com.mongodb.internal.dns.DefaultDnsResolver.resolveAdditionalQueryParametersFromTxtRecords(DefaultDnsResolver.java:112)
at com.mongodb.ConnectionString.<init>(ConnectionString.java:382)
at com.mongodb.MongoClientURI.<init>(MongoClientURI.java:257)
at com.mongodb.MongoClientURI.<init>(MongoClientURI.java:239)
at com.example.helloworld.MongoDBConnectionActivity$MongoDBConnectionManager.doInBackground(MongoDBConnectionActivity.java:69)
at com.example.helloworld.MongoDBConnectionActivity$MongoDBConnectionManager.doInBackground(MongoDBConnectionActivity.java:42)
at android.os.AsyncTask$2.call(AsyncTask.java:316)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:255)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:776)
I/Process: Sending signal. PID: 3802 SIG: 9
Connected to process 3984 on device 'huawei-eva_l19-XVVFL17619000004'.
Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page.
W/System: ClassLoader referenced unknown path: /data/app/com.example.helloworld-2/lib/arm64
I/HwCust: Constructor found for class android.app.HwCustActivityImpl
I/HwCust: Constructor found for class android.app.HwCustHwWallpaperManagerImpl
W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter androidx.vectordrawable.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
I/art: Rejecting re-init on previously-failed class java.lang.Class<androidx.core.view.ViewCompat$2>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/view/View$OnUnhandledKeyEventListener;
at void androidx.core.view.ViewCompat.setBackground(android.view.View, android.graphics.drawable.Drawable) (ViewCompat.java:2678)
at void androidx.appcompat.widget.ActionBarContainer.<init>(android.content.Context, android.util.AttributeSet) (ActionBarContainer.java:63)
at java.lang.Object java.lang.reflect.Constructor.newInstance0!(java.lang.Object[]) (Constructor.java:-2)
at java.lang.Object java.lang.reflect.Constructor.newInstance(java.lang.Object[]) (Constructor.java:430)
at android.view.View android.view.LayoutInflater.createView(java.lang.String, java.lang.String, android.util.AttributeSet) (LayoutInflater.java:656)
at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet, boolean) (LayoutInflater.java:798)
at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet) (LayoutInflater.java:738)
at void android.view.LayoutInflater.rInflate(org.xmlpull.v1.XmlPullParser, android.view.View, android.content.Context, android.util.AttributeSet, boolean) (LayoutInflater.java:869)
at void android.view.LayoutInflater.rInflateChildren(org.xmlpull.v1.XmlPullParser, android.view.View, android.util.AttributeSet, boolean) (LayoutInflater.java:832)
at android.view.View android.view.LayoutInflater.inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup, boolean) (LayoutInflater.java:518)
at android.view.View android.view.LayoutInflater.inflate(int, android.view.ViewGroup, boolean) (LayoutInflater.java:426)
at android.view.View android.view.LayoutInflater.inflate(int, android.view.ViewGroup) (LayoutInflater.java:377)
at android.view.ViewGroup androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor() (AppCompatDelegateImpl.java:896)
at void androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor() (AppCompatDelegateImpl.java:806)
I/art: at void androidx.appcompat.app.AppCompatDelegateImpl.setContentView(int) (AppCompatDelegateImpl.java:693)
at void androidx.appcompat.app.AppCompatActivity.setContentView(int) (AppCompatActivity.java:170)
at void com.example.helloworld.MainActivity.onCreate(android.os.Bundle) (MainActivity.java:23)
at void android.app.Activity.performCreate(android.os.Bundle) (Activity.java:6915)
at void android.app.Instrumentation.callActivityOnCreate(android.app.Activity, android.os.Bundle) (Instrumentation.java:1123)
at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2746)
at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2864)
at void android.app.ActivityThread.-wrap12(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1567)
at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:105)
at void android.os.Looper.loop() (Looper.java:156)
at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6523)
at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:942)
at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:832)
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.View$OnUnhandledKeyEventListener" on path: DexPathList[[zip file "/data/app/com.example.helloworld-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.helloworld-2/lib/arm64, /system/lib64, /vendor/lib64, /system/vendor/lib64, /product/lib64]]
at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:56)
at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:380)
at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
at void androidx.core.view.ViewCompat.setBackground(android.view.View, android.graphics.drawable.Drawable) (ViewCompat.java:2678)
at void androidx.appcompat.widget.ActionBarContainer.<init>(android.content.Context, android.util.AttributeSet) (ActionBarContainer.java:63)
at java.lang.Object java.lang.reflect.Constructor.newInstance0!(java.lang.Object[]) (Constructor.java:-2)
at java.lang.Object java.lang.reflect.Constructor.newInstance(java.lang.Object[]) (Constructor.java:430)
at android.view.View android.view.LayoutInflater.createView(java.lang.String, java.lang.String, android.util.AttributeSet) (LayoutInflater.java:656)
at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet, boolean) (LayoutInflater.java:798)
at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet) (LayoutInflater.java:738)
at void android.view.LayoutInflater.rInflate(org.xmlpull.v1.XmlPullParser, android.view.View, android.content.Context, android.util.AttributeSet, boolean) (LayoutInflater.java:869)
at void android.view.LayoutInflater.rInflateChildren(org.xmlpull.v1.XmlPullParser, android.view.View, android.util.AttributeSet, boolean) (LayoutInflater.java:832)
at android.view.View android.view.LayoutInflater.inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup, boolean) (LayoutInflater.java:518)
at android.view.View android.view.LayoutInflater.inflate(int, android.view.ViewGroup, boolean) (LayoutInflater.java:426)
at android.view.View android.view.LayoutInflater.inflate(int, android.view.ViewGroup) (LayoutInflater.java:377)
at android.view.ViewGroup androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor() (AppCompatDelegateImpl.java:896)
at void androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor() (AppCompatDelegateImpl.java:806)
at void androidx.appcompat.app.AppCompatDelegateImpl.setContentView(int) (AppCompatDelegateImpl.java:693)
at void androidx.appcompat.app.AppCompatActivity.setContentView(int) (AppCompatActivity.java:170)
at void com.example.helloworld.MainActivity.onCreate(android.os.Bundle) (MainActivity.java:23)
at void android.app.Activity.performCreate(android.os.Bundle) (Activity.java:6915)
at void android.app.Instrumentation.callActivityOnCreate(android.app.Activity, android.os.Bundle) (Instrumentation.java:1123)
at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2746)
at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2864)
at void android.app.ActivityThread.-wrap12(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1567)
at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:105)
at void android.os.Looper.loop() (Looper.java:156)
at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6523)
at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:942)
at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:832)
W/VRSystemServiceManager: vr service is not alive
I/HwSecImmHelper: mSecurityInputMethodService is null
I/HwPointEventFilter: support AFT
I/OpenGLRenderer: Initialized EGL, version 1.4
W/linker: /vendor/lib64/libhwuibp.so: unused DT entry: type 0xf arg 0xe3a
I/art: Do partial code cache collection, code=22KB, data=30KB
After code cache collection, code=22KB, data=30KB
I/art: Increasing code cache capacity to 128KB
【问题讨论】:
标签: java android mongodb gradle mongodb-atlas