JAVA DynamoDB: nicht unterstützt; erfordert @DynamoDBTyped oder @DynamoDBTypeConverted
Habe ich erstellt CRUD-Methoden, aber ich habe einige Probleme damit.
Dies ist meine add-Methode code:
public Product addProduct(Product content) {
Product item = new Product();
item.setName(content.getName());
item.setCalories(content.getCalories());
item.setFat(content.getFat());
item.setCarbo(content.getCarbo());
item.setProtein(content.getProtein());
item.setProductKinds(content.getProductKinds());
item.setAuthor(content.getAuthor());
item.setMedia(content.getMedia());
item.setApproved(content.getApproved());
databaseController.saveTest(item);
logger.log("Item created");
return item;
}
Dies ist mein editProduct Methode:
public Product editProduct(Product product) {
Product databaseProduct = databaseController.get(Product.class, product.getId());
databaseProduct.setAllProducts(product);
databaseController.save(databaseProduct);
return databaseProduct;
}
In der model-Klasse, die ich denke, dass ich alles richtig machte :
package pl.javamill.model.kitchen;
import com.amazonaws.services.dynamodbv2.datamodeling.*;
import pl.javamill.model.Request;
import pl.javamill.model.common.Author;
import pl.javamill.model.common.AuthorConverter;
import pl.javamill.model.common.Media;
import pl.javamill.model.common.MediaConverter;
import java.util.List;
@DynamoDBTable(tableName = "product")
public class Product extends Request {
/**
* Id of kitchen content
*/
private String id;
/**
* Name of product
*/
private String name;
/**
* Calories in 100g
*/
private Integer calories;
/**
* Fat in 100g
*/
private Double fat;
/**
* Total carbo in 100g
*/
private Double carbo;
/**
* Total Protein in 100g
*/
private Double protein;
/**
* Labels of product for example gluten fee product
*/
private List<ProductKind> productKinds;
/**
* Author of content.
*/
private Author author;
/**
* Address of content image.
*/
private Media media;
private Boolean approved;
@DynamoDBHashKey(attributeName = "id")
@DynamoDBAutoGeneratedKey
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@DynamoDBAttribute(attributeName = "Name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@DynamoDBAttribute(attributeName = "Calories")
public Integer getCalories() {
return calories;
}
public void setCalories(Integer calories) {
this.calories = calories;
}
@DynamoDBAttribute(attributeName = "Fat")
public Double getFat() {
return fat;
}
public void setFat(Double fat) {
this.fat = fat;
}
@DynamoDBAttribute(attributeName = "Carbo")
public Double getCarbo() {
return carbo;
}
public void setCarbo(Double carbo) {
this.carbo = carbo;
}
@DynamoDBAttribute(attributeName = "Protein")
public Double getProtein() {
return protein;
}
public void setProtein(Double protein) {
this.protein = protein;
}
@DynamoDBTypeConvertedEnum
@DynamoDBTypeConverted(converter = ProductKindConverter.class)
@DynamoDBAttribute(attributeName = "ProductKinds")
public List<ProductKind> getProductKinds() {
return productKinds;
}
public void setProductKinds(List<ProductKind> productKinds) {
this.productKinds = productKinds;
}
@DynamoDBTypeConverted(converter = AuthorConverter.class)
@DynamoDBAttribute(attributeName = "Author")
public Author getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
@DynamoDBTypeConverted(converter = MediaConverter.class)
@DynamoDBAttribute(attributeName = "Media")
public Media getMedia() {
return media;
}
public void setMedia(Media media) {
this.media = media;
}
@DynamoDBAttribute(attributeName = "Approved")
public Boolean getApproved() {
return approved;
}
public void setApproved(Boolean approved) {
this.approved = approved;
}
public void setAllProducts(Product product) {
if (!getName().equals(product.getName())) {
setName(product.getName());
}
if (!getCalories().equals(product.getCalories())) {
setCalories(product.getCalories());
}
if (!getFat().equals(product.getFat())) {
setFat(product.getFat());
}
if (!getCarbo().equals(product.getCarbo())) {
setCarbo(product.getCarbo());
}
if (!getProtein().equals(product.getProtein())) {
setProtein(product.getProtein());
}
if (!getProductKinds().equals(product.getProductKinds())) {
setProductKinds(product.getProductKinds());
}
if (!getAuthor().equals(product.getAuthor())) {
setAuthor(product.getAuthor());
}
if (!getMedia().equals(product.getMedia())) {
setMedia(product.getMedia());
}
if (!getApproved().equals(product.getApproved())) {
setApproved(product.getApproved());
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Product product = (Product) o;
if (name != null ? !name.equals(product.name) : product.name != null) return false;
if (calories != null ? !calories.equals(product.calories) : product.calories != null) return false;
if (fat != null ? !fat.equals(product.fat) : product.fat != null) return false;
if (carbo != null ? !carbo.equals(product.carbo) : product.carbo != null) return false;
if (protein != null ? !protein.equals(product.protein) : product.protein != null) return false;
if (productKinds != null ? !productKinds.equals(product.productKinds) : product.productKinds != null)
return false;
if (author != null ? !author.equals(product.author) : product.author != null) return false;
if (media != null ? !media.equals(product.media) : product.media != null) return false;
return approved != null ? approved.equals(product.approved) : product.approved == null;
}
@Override
public int hashCode() {
int result = id != null ? id.hashCode() : 0;
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + (calories != null ? calories.hashCode() : 0);
result = 31 * result + (fat != null ? fat.hashCode() : 0);
result = 31 * result + (carbo != null ? carbo.hashCode() : 0);
result = 31 * result + (protein != null ? protein.hashCode() : 0);
result = 31 * result + (productKinds != null ? productKinds.hashCode() : 0);
result = 31 * result + (author != null ? author.hashCode() : 0);
result = 31 * result + (media != null ? media.hashCode() : 0);
result = 31 * result + (approved != null ? approved.hashCode() : 0);
return result;
}
}
ProductKindConventor:
public class ProductKindConverter implements DynamoDBTypeConverter<String, List<ProductKind>> {
@Override
public String convert(List<ProductKind> objects) {
//Jackson object mapper
ObjectMapper objectMapper = new ObjectMapper();
try {
String objectsString = objectMapper.writeValueAsString(objects);
return objectsString;
} catch (JsonProcessingException e) {
//do something
}
return null;
}
@Override
public List<ProductKind> unconvert(String objectsString) {
ObjectMapper objectMapper = new ObjectMapper();
try {
List<ProductKind> objects = objectMapper.readValue(objectsString, new TypeReference<List<ProductKind>>(){});
return objects;
} catch (JsonParseException e) {
//do something
} catch (JsonMappingException e) {
//do something
} catch (IOException e) {
//do something
}
return null;
}
}
Save-Methode in dbcontroller:
public void saveTest(Product product){
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
.withRegion(regions).build();
mapper = new DynamoDBMapper(client);
mapper.save(product);
}
Produkt von DB-Methode:
public Product getTest(String id) {
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
.withRegion(regions).build();
mapper = new DynamoDBMapper(client);
Product retrivedProduct = mapper.load(Product.class, id);
return retrivedProduct;
}
Unit-test bestanden, alles scheint ok zu sein, aber wenn ich mit POSTMAN testen, ich habe einige Fehler. Ich sende Produkt als json und wie es scheint, dass:
{"id":null,"name":"yoloornotyolo","calories":1000,"fat":400.0,"carbo":20.0,"protein":40.0,"productKinds":["MEAT"],"author":{"name":"Plejer Annołn","id":"testID2"},"media":{"name":"heheszki","url":"http://blabla.pl","mediaType":"BILD"},"approved":false}
Dann hab ich ""message": "Internal server error" -", also ich check log-Datei und das was ich sehen kann:
nicht unterstützt; erfordert @DynamoDBTyped oder @DynamoDBTypeConverted: com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException
Ich weiß nicht, was falsch ist. Kann jemand erklären mir, was ich wohl zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wäre es nützlich zu sehen, dass Ihr saveProduct Methode. Sie sind mit DynamoDBMapper Anmerkungen, aber es sieht aus wie Sie versuchen, zu speichern ein Element-Objekt, nicht ein Product-Objekt. Anstatt
Verwenden
Eine Sache, die ich noch erwähnen möchte ist, dass Sie entlasten kann der Umgang mit den generierten id zu DyanmoDBMapper mit der DynamoDBAutoGeneratedKey annotation
In Ihrer model-Klasse machen:
Dann brauchen Sie nicht zu behandeln-id in Ihrem addProduct-Methode
EDIT: Dein saveProduct Methode sollte entlang der Linien von
Ich bezweifle, dass Sie brauchen, um die übergabe eines tablename, wie das ist, eine Anmerkung auf dein Produkt-Objekt. Sie sollten nicht mit putItem.
BEARBEITEN:
Ihre saveProduct Methode sollte ein Produkt-Objekt, nicht ein item-Objekt. Dont verwenden Sie putItem, weil diese nicht wissen, über Ihre model-Klasse. Verwenden DynamoDBMapper save-Funktion. Sie nicht brauchen, um geben Sie den Namen der Tabelle, wie das ist, einen Hinweis auf Ihr Produkt, Klasse (die Tabelle namens "Produkt"). Sie verwenden sollten, AmazonDynamoDB für die Anbindung an DynamoDB. Die unten beschriebene Methode zurück, ist nichtig, so dass Sie müssen aktualisieren Sie die addProduct-Methode.
BEARBEITEN:
Sie bauen ein AmazonDynamoDB Benutzeroberfläche
BEARBEITEN:
DynamoDBMapper unterstützt nur bestimmte Datentypen.
Haben Sie drei komplexe Daten-Typen; productKind, Autor und Medien. Wenn Sie möchten, speichern Sie diese in Ihrer Datenbank, müssen Sie schreiben ein Konverter-Klasse für jeden. Die Konverter Klasse definieren in der Regel wie konvertieren Sie Ihr Objekt in einen string und wieder zurück.
EDIT: Dein set, ProductKind, benötigen Sie einen Konverter, der aussieht wie diese. Ändern Sie einfach 'MyObject' zu ProductKinds.
Wäre es sinnvoll, einen stack-trace der exception. In der zwischen-Nachricht enthält die Daten geben und Feld-Informationen, die nicht umgewandelt werden.
Normalerweise brauchen Sie dies nicht machen, ohne Konverter, nur sicher sein, @DynamoDBDocument auf alle benutzerdefinierten Klassen und @DynamoDBTypeConvertedEnum auf alle benutzerdefinierten enums verwendet.