Ruturaj Gole
Ruturaj Gole

Reputation: 91

DynamoDB No interface and no DynamoDBHashKey notation found error

I have already seen other similar questions, all of them had mistakenly written @DynamoDBHashKey as @DynamoDBIndexHashKey, but I haven't.

I don't want a sort key or index. I have already created my table with the primary key as email.

NewUser.Java

import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBAttribute;
import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBHashKey;
import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBTable;

mHandler.post(new Runnable() {
            public void run() {
                EditText name=(EditText)findViewById(R.id.RegisterName);
                EditText email=(EditText)findViewById(R.id.Email);
                Logindatabase login = new Logindatabase();
                login.setEmail(email.getText().toString());
                login.setName(name.getText().toString());
                login.setStatus();
                mapper.save(login); //Exception is thrown here
                Toast.makeText(NewUser.this, "Sent", Toast.LENGTH_SHORT).show();
            }
        });

Logindatabase.java

@DynamoDBTable(tableName = "Login")
public class Logindatabase {
private String email;
private String Name;
private String password;
private String Status;
@DynamoDBHashKey(attributeName = "Email")
public void setEmail(String email){
    this.email=email;
}
public String getEmail(){return email;}
@DynamoDBAttribute(attributeName = "Name")
public void setName(String Name){
    this.Name=Name;
}
public String getName(){
    return Name;
}
@DynamoDBAttribute(attributeName = "Status")
public void setStatus()
{
    Status="Pending";
}
}

logcat

E/AndroidRuntime: FATAL EXCEPTION: main
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMappingException: No interface com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBHashKey annotation found in class class com.example.sherry.empapp.Logindatabase
                                                                           at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.needAutoGenerateAssignableKey(DynamoDBMapper.java:720)
                                                                           at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.save(DynamoDBMapper.java:780)
                                                                           at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.save(DynamoDBMapper.java:688)
                                                                           at com.example.sherry.empapp.NewUser$1.run(NewUser.java:67)
                                                                           at android.os.Handler.handleCallback(Handler.java:730)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:92)
                                                                           at android.os.Looper.loop(Looper.java:176)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:5419)
                                                                           at java.lang.reflect.Method.invokeNative(Native Method)
                                                                           at java.lang.reflect.Method.invoke(Method.java:525)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
                                                                           at dalvik.system.NativeStart.main(Native Method)

Upvotes: 0

Views: 1607

Answers (2)

Koitoer
Koitoer

Reputation: 19543

In case you are using lombok to avoid the creation of getter and setter the annotation @DynamoDBHashKey can be used directly on the field and in the setter as well ElementType.FIELD, ElementType.METHOD

import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBAttribute;
import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBHashKey;
import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBRangeKey;
import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBTable;
import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBVersionAttribute;

import lombok.Builder;
import lombok.Data;

@Builder
@Data
@DynamoDBTable(tableName = "ProductTable")
public class Product {

@DynamoDBHashKey
private String userName;

@DynamoDBRangeKey
private Long range;

@DynamoDBVersionAttribute
private Long version;

@DynamoDBAttribute(attributeName = "name")
private String name;
}

In this case, the setters are still needed but those were added by the lombok @Data annotation.

Upvotes: 1

notionquest
notionquest

Reputation: 39226

The @DynamoDBHashKey annotation should be added for get method rather than set method.

Also, please ensure that hash key attribute name matches (defined in model class i.e. Logindatabase) with DynamoDB table hash key attribute definition (and it is case sensitive).

@DynamoDBHashKey(attributeName = "email")
public String getEmail() {
    return email;
}

Upvotes: 1

Related Questions