您好我正在尝试将cognito用户ID添加到DynamoDB Users表中。
所以在identityManager.java类中,我在后台调用一个函数来在表中创建用户。
我在mapper.save(用户)行上遇到空指针异常但不确定原因。
这是我创建映射器的地方:
public class IdentityManager {
DynamoDBMapper mapper;
public IdentityManager() {
mapper = AWSMobileClient.defaultMobileClient().getDynamoDBMapper();
}
这是我称之为添加用户功能的地方:
private void onCognitoSuccess() {
handler.onSuccess(currentIdentityProvider);
// Adds a new user
new addUser().execute();
这是添加用户功能:
public class addUser extends AsyncTask {
@Override
protected Object doInBackground(Object[] params) {
UserDatabaseMappingAdapter user = new UserDatabaseMappingAdapter();
user.setUserID("testUserID");
mapper.save(user);
return null;
}
这是getter / setter userDataBaseMappingAdapter:
@DynamoDBTable(tableName = "UsersBeta")
public class UserDatabaseMappingAdapter {
private String userid;
@DynamoDBHashKey(attributeName = "UserID")
public String getUserID() {
return userid;
}
public void setUserID(String userid) {
this.userid = userid;
}
这是我得到的完整错误:
FATAL EXCEPTION: AsyncTask #2
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
at java.util.concurrent.FutureTask.run(FutureTask.java:239)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.NullPointerException
at com.amazonaws.mobile.user.IdentityManager$addUser.doInBackground(IdentityManager.java:522)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run
答案 0 :(得分:0)
请检查
mapper = AWSMobileClient.defaultMobileClient().getDynamoDBMapper()
正在给予值或为空。
还要确保在执行代码mapper.save(user);
答案 1 :(得分:0)
我很遗憾听到您遇到这个导致NPE的问题。之所以发生这种情况,可能是因为在创建IdentityManager时尚未初始化AWSMobileClient。 IdentityManger负责创建获取Dynamo客户端所需的凭证提供程序,因此无法从IdentityManager的构造函数中检索它。
我建议尝试从异步任务addUser.doInBackground()方法调用AWSMobileClient.defaultMobileClient()。getDynamoDBMapper()。
另外需要指出的是,如果设置一个需要跨线程访问的成员变量,则应将其声明为volatile,或者如果在构造函数中设置它,则应将其声明为final,如果它将从另一个访问线程。
我期待着您的回复。