-1

I am trying to push data into AWS DynamoDB but I keep facing this error:

java.lang.NullPointerException: Attempt to invoke virtual method 'com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper com.uploadtodatabasevts.amazonaws.AWSMobileClient.getDynamoDBMapper()' on a null object reference

Any idea on what is missing out or what did I enter wrongly? I can't seem to find out.

Below is the MainActivity class:

For the outfitID its suppose to be a primary key auto increment but i have no idea how to do it on AWS DynamoDB NoSQL so I am currently pushing the ID in manually.

package com.uploadtodatabasevts;

import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.amazonaws.AmazonClientException;
import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper;
import com.uploadtodatabasevts.amazonaws.AWSMobileClient;
import com.uploadtodatabasevts.amazonaws.DynamoDBUtils;
import com.uploadtodatabasevts.amazonaws.OutfitDO;
import com.uploadtodatabasevts.amazonaws.ThreadUtils;

public class MainActivity extends AppCompatActivity {

    private static final String LOG_TAG = MainActivity.class.getName();
    String pID, pDetails;
    double oID;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText outfitID = (EditText)findViewById(R.id.eTxtOutfitID);


        EditText productID = (EditText)findViewById(R.id.eTxtProductID);
        pID = productID.getText().toString();

        EditText productDetails = (EditText)findViewById(R.id.eTxtProductDetails);
        pDetails = productDetails.getText().toString();

        Button confirm = (Button)findViewById(R.id.btnConfirm);
        confirm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                insertData();

            }
        });

    }

    private void insertData() throws AmazonClientException {
        final DynamoDBMapper dynamoDBMapper = AWSMobileClient.defaultMobileClient().getDynamoDBMapper();
        final OutfitDO outfitDO = new OutfitDO();

        outfitDO.setOutfitId((double) 10);
        outfitDO.setOutfitId(oID);
        outfitDO.setItemOneId(pID);
        outfitDO.setItemOneDetails(pDetails);
        AmazonClientException lastException = null;

        try {
            dynamoDBMapper.save(outfitDO);
        }  catch (final AmazonClientException ex) {
            Log.e(LOG_TAG, "Failed saving item : " + ex.getMessage(), ex);
            lastException = ex;
        }

        if (lastException != null){
            throw lastException;
        }

    }
}

Below is the AWSMobileClient:

package com.uploadtodatabasevts.amazonaws;

import android.content.Context;
import android.util.Log;

import com.amazonaws.ClientConfiguration;
import com.uploadtodatabasevts.amazonaws.IdentityManager;
import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;

/**
 * The AWS Mobile Client bootstraps the application to make calls to AWS 
 * services. It creates clients which can be used to call services backing the
 * features you selected in your project.
 */
public class AWSMobileClient {

    private static final String LOG_TAG = AWSMobileClient.class.getSimpleName();

    private static AWSMobileClient instance;

    private final Context context;

    private ClientConfiguration clientConfiguration;
    private IdentityManager identityManager;
    private AmazonDynamoDBClient dynamoDBClient;
    private DynamoDBMapper dynamoDBMapper;

    /**
     * Build class used to create the AWS mobile client.
     */
    public static class Builder {

        private Context applicationContext;
        private String  cognitoIdentityPoolID;
        private Regions cognitoRegion;
        private ClientConfiguration clientConfiguration;
        private IdentityManager identityManager;

 /**
  * Constructor.
  * @param context Android context.
  */
        public Builder(final Context context) {
            this.applicationContext = context.getApplicationContext();
        };

 /**
  * Provides the Amazon Cognito Identity Pool ID.
  * @param cognitoIdentityPoolID identity pool ID
  * @return builder
  */
        public Builder withCognitoIdentityPoolID(final String cognitoIdentityPoolID) {
            this.cognitoIdentityPoolID = cognitoIdentityPoolID;
            return this;
        };
        
 /**
  * Provides the Amazon Cognito service region.
  * @param cognitoRegion service region
  * @return builder
  */
        public Builder withCognitoRegion(final Regions cognitoRegion) {
            this.cognitoRegion = cognitoRegion;
            return this;
        }

        /**
         * Provides the identity manager.
  * @param identityManager identity manager
  * @return builder
  */
        public Builder withIdentityManager(final IdentityManager identityManager) {
            this.identityManager = identityManager;
            return this;
        }

        /**
         * Provides the client configuration
         * @param clientConfiguration client configuration
         * @return builder
         */
        public Builder withClientConfiguration(final ClientConfiguration clientConfiguration) {
            this.clientConfiguration = clientConfiguration;
            return this;
        }

 /**
  * Creates the AWS mobile client instance and initializes it.
  * @return AWS mobile client
  */
        public AWSMobileClient build() {
            return
                new AWSMobileClient(applicationContext,
                                    cognitoIdentityPoolID,
                                    cognitoRegion,
                                    identityManager,
                                    clientConfiguration);
        }
    }

    private AWSMobileClient(final Context context,
                            final String  cognitoIdentityPoolID,
                            final Regions cognitoRegion,
                            final IdentityManager identityManager,
                            final ClientConfiguration clientConfiguration) {

        this.context = context;
        this.identityManager = identityManager;
        this.clientConfiguration = clientConfiguration;

        this.dynamoDBClient = new AmazonDynamoDBClient(identityManager.getCredentialsProvider(), clientConfiguration);
        this.dynamoDBClient.setRegion(Region.getRegion(AWSConfiguration.AMAZON_DYNAMODB_REGION));
        this.dynamoDBMapper = new DynamoDBMapper(dynamoDBClient);
    }

    /**
     * Sets the singleton instance of the AWS mobile client.
     * @param client client instance
     */
    public static void setDefaultMobileClient(AWSMobileClient client) {
        instance = client;
    }

    /**
     * Gets the default singleton instance of the AWS mobile client.
     * @return client
     */
    public static AWSMobileClient defaultMobileClient() {
        return instance;
    }

    /**
     * Gets the identity manager.
     * @return identity manager
     */
    public IdentityManager getIdentityManager() {
        return this.identityManager;
    }

    /**
     * Creates and initialize the default AWSMobileClient if it doesn't already
     * exist using configuration constants from {@link AWSConfiguration}.
     *
     * @param context an application context.
     */
    public static void initializeMobileClientIfNecessary(final Context context) {
        if (AWSMobileClient.defaultMobileClient() == null) {
            Log.d(LOG_TAG, "Initializing AWS Mobile Client...");
            final ClientConfiguration clientConfiguration = new ClientConfiguration();
            clientConfiguration.setUserAgent(AWSConfiguration.AWS_MOBILEHUB_USER_AGENT);
            final IdentityManager identityManager = new IdentityManager(context, clientConfiguration);
            final AWSMobileClient awsClient =
                new AWSMobileClient.Builder(context)
                    .withCognitoRegion(AWSConfiguration.AMAZON_COGNITO_REGION)
                    .withCognitoIdentityPoolID(AWSConfiguration.AMAZON_COGNITO_IDENTITY_POOL_ID)
                    .withIdentityManager(identityManager)
                    .withClientConfiguration(clientConfiguration)
                    .build();

            AWSMobileClient.setDefaultMobileClient(awsClient);
        }
        Log.d(LOG_TAG, "AWS Mobile Client is OK");
    }

    /**
     * Gets the DynamoDB Client, which allows accessing Amazon DynamoDB tables.
     * @return the DynamoDB client instance.
     */
    public AmazonDynamoDBClient getDynamoDBClient() {
        return dynamoDBClient;
    }

    /**
     * Gets the Dynamo DB Object Mapper, which allows accessing DynamoDB tables using annotated
     * data object classes to represent your data using POJOs (Plain Old Java Objects).
     * @return the DynamoDB Object Mapper instance.
     */
    public DynamoDBMapper getDynamoDBMapper() {
        return dynamoDBMapper;
    }

}
SusanooJK
  • 3
  • 5
  • Possible duplicate of [What is a NullPointerException, and how do I fix it?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – Shaishav Jogani Feb 12 '17 at 18:39
  • Post the code of `AWSMobileClient` class. – Asif Patel Feb 12 '17 at 18:44
  • It seems pretty clear that AWSMobileClient.defaultMobileClient() is returning a null. Since you haven't posted that code, however, it's impossible to tell why. ff it's not obvious upon reading the code, your first step should be using the debugger to figure out why. – GreyBeardedGeek Feb 12 '17 at 20:53
  • I have added the AWSMobileClient class – SusanooJK Feb 13 '17 at 13:39

1 Answers1

2

Your Application class should have code that initializes the mobile client by calling AWSMobileClient.initializeMobileClientIfNecessary(context) otherwise AWSMobileClient.defaultMobileClient() will return null. If you do not have a custom Application class, you could call AWSMobileClient.initializeMobileClientIfNecessary(context) in your Activity's onCreate() lifecycle method.

Jeff Solinsky
  • 271
  • 1
  • 4