2017-04-14 6 views
2

Ich habe eine Klasse namens SampleEntity, dh ein POJO, der mir hilft, meine dynamoDB-Tabelle zu erstellen. Der Hash-Schlüssel und der Bereichsschlüssel wurden im POJO-Objekt eindeutig definiert, aber ich bekomme trotzdem eine Ausnahme Schlüssel nichtDynamoDBMappingException: kein HASH-Schlüsselwert vorhanden

@DynamoDBTable(tableName = "sampletable1") 
    public class SampleEntity { 

    public static final String HASH_KEY = "f1_hash"; 
    public static final String RANGE_KEY = "f2_range"; 

    @DynamoDBAttribute(attributeName = HASH_KEY) 
    @DynamoDBHashKey 
    private Integer feild1; 

    @DynamoDBAttribute(attributeName = RANGE_KEY) 
    @DynamoDBRangeKey 
    private String field2; 

    @DynamoDBAttribute(attributeName = "f3") 
    private String feild3; 

    @DynamoDBAttribute(attributeName = "f4") 
    private String feild4; 

    @DynamoDBAttribute(attributeName = "f5") 
    private String feild5; 


    public Integer getFeild1() { 
     return feild1; 
    } 

    public void setFeild1(Integer feild1) { 
     this.feild1 = feild1; 
    } 

    public String getField2() { 
     return field2; 
    } 

    public void setField2(String field2) { 
     this.field2 = field2; 
    } 

    public String getFeild3() { 
     return feild3; 
    } 

    public void setFeild3(String feild3) { 
     this.feild3 = feild3; 
    } 

    public String getFeild4() { 
     return feild4; 
    } 

    public void setFeild4(String feild4) { 
     this.feild4 = feild4; 
    } 

    public String getFeild5() { 
     return feild5; 
    } 

    public void setFeild5(String feild5) { 
     this.feild5 = feild5; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (!(o instanceof SampleEntity)) return false; 

     SampleEntity that = (SampleEntity) o; 

     if (!getFeild1().equals(that.getFeild1())) return false; 
     if (!getField2().equals(that.getField2())) return false; 
     if (!getFeild3().equals(that.getFeild3())) return false; 
     if (!getFeild4().equals(that.getFeild4())) return false; 
     return getFeild5().equals(that.getFeild5()); 
    } 

    @Override 
    public int hashCode() { 
     int result = getFeild1().hashCode(); 
     result = 31 * result + getField2().hashCode(); 
     result = 31 * result + getFeild3().hashCode(); 
     result = 31 * result + getFeild4().hashCode(); 
     result = 31 * result + getFeild5().hashCode(); 


      return result; 
     } 
} 

Das ist meine Klasse definiert ist, und ich bin die Ausgabe einer Tabelle auf Anfrage dieser Klasse erstellen, aber ich habe DynamoDBMappingException, dass kein HASH Schlüsselwert vorhanden ist.

server = ServerRunner.createServerFromCommandLineArgs(new String[]{"-inMemory", "-port", "8005"}); 
server.start(); 
dynamoDBClient = new AmazonDynamoDBClient(new BasicAWSCredentials("any", "thing")).withEndpoint("http://localhost:8005"); 

dbMapper = new DynamoDBMapper(dynamoDBClient); 

CreateTableRequest createTableRequest = ddbMapper.generateCreateTableRequest(SampleEntity.class); 
createTableRequest.setProvisionedThroughput(new ProvisionedThroughput(5L, 5L)); 
     dynamoDBClient.createTable(createTableRequest); 
     SampleLoginEntity data= new SampleLoginEntity(); 
     data.setLogin(123); 
     data.setField2("range"); 
     data.setFeild3("abc"); 
     dbMapper.save(data); 

Antwort

2

Es gibt zwei mögliche Probleme, die ich sehen kann (eine, auf die ich kürzlich gestoßen bin), aber Ihr Setup ist etwas anders als meines.

Sie verwenden sowohl @DynamoDBAttribute als auch @DynamoDBHashKey für ein einzelnes Element - das ist nicht notwendig und könnte es vermasseln, obwohl ich momentan keine Zeit habe, es zu testen. Sie sollten nur tun können, @DynamoDBHashKey(attributeName=HASH_KEY) und alles wird gut. Ich denke, wie es ist, könnten Sie ein Attribut als "f1_hash" und einen Hash-Schlüssel namens "field1" deklarieren, die beide auf denselben internen Wert abgebildet werden (obwohl ich falsch liegen könnte).

Das Problem, das ich hatte, ist tatsächlich ein Ergebnis dieser Fehlermeldung wird wirklich schlecht formuliert - es wird diese Ausnahme auslösen, wenn Sie dbMapper.save() mit einem Objekt mit dem Hash-Schlüssel Wert auf Null gesetzt, obwohl Ihre setLogin() wurde angenommen zu sein setField1() das sollte hier nicht das Problem sein.

Verwandte Themen