- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个问题,我无法处理。例如,我在 KitchenService 中创建了 CRUD 方法。我有 addProduct 等方法,这些方法工作正常。但是我有 Recipe 类,我在其中使用 Product 类字段。在这种情况下,我遇到了很大的问题。
我的 addRecipe 方法:
public Recipe addRecipe (Recipe recipe){
List<RecipeElement> recipeElements = recipe.getRecipeElements();
for (RecipeElement recipeElement : recipeElements) {
String id = recipeElement.getProduct().getId();
Product product = databaseController.get(Product.class, id);
recipeElement.setProduct(product);
}
databaseController.saveRecipe(recipe);
logger.log("Recipe created");
return recipe;
构建成功所以我想在 POSTMAN 中测试它,这就是我发送的 JSON 女巫的样子:
{"id":null,"name":"test3","labels":["GLUTEN_FREE"],"author":{"name":"Plejer Annołn","id":"testID2"},"media":{"name":"heheszki","url":"http://blabla.pl","mediaType":"IMAGE"},"recipeElements":[{"product":{"id":"ecacaf36-29a2-41c6-942e-be5a715ed094"},"weight":"100"}],"approved":false}
然后我收到“消息”:“内部服务器错误”,所以我正在检查日志,这就是我在那里发现的:
Product[Media]; could not unconvert attribute: com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException
Caused by: com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException: could not invoke public void pl.javamill.model.kitchen.Product.setMedia(pl.javamill.model.common.Media) on class pl.kitchen.Product with value {name=heheszki, url=http://blabla.pl, mediaType=IMAGE} of type class java.util.LinkedHashMap
配方类是这样的:
@DynamoDBTable(tableName = "recipe")
public class Recipe extends Request {
/**
* Id of kitchen content
*/
private String id;
/**
* Name of recipe
*/
private String name;
/**
* Labels of product for example gluten fee product
*/
private List<KitchenLabel> labels;
/**
* Author of content.
*/
private Author author;
/**
* Address of content image.
*/
private Media media;
private Boolean approved;
private List<RecipeElement> recipeElements;
@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;
}
@DynamoDBTypeConverted(converter = EnumConverter.class)
@DynamoDBAttribute(attributeName = "Labels")
public List<KitchenLabel> getLabels() {
return labels;
}
public void setLabels(List<KitchenLabel> labels) {
this.labels = labels;
}
@DynamoDBTypeConverted(converter = ObjectConverter.class)
@DynamoDBAttribute(attributeName = "Author")
public Author getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
@DynamoDBTypeConverted(converter = ObjectConverter.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;
}
@DynamoDBTypeConverted(converter = ObjectConverter.class)
@DynamoDBAttribute(attributeName = "RecipeElements")
public List<RecipeElement> getRecipeElements() {
return recipeElements;
}
public void setRecipeElements(List<RecipeElement> recipeElements) {
this.recipeElements = recipeElements;
}
食谱元素类:
public class RecipeElement {
private Product product;
private Integer weight;
@DynamoDBTypeConverted(converter = ObjectConverter.class)
@DynamoDBHashKey(attributeName = "product")
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
public Integer getWeight() {
return weight;
}
public void setWeight(Integer weight) {
this.weight = weight;
}
}
和产品类别:
@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;
}
@DynamoDBTypeConverted(converter = EnumConverter.class)
@DynamoDBAttribute(attributeName = "ProductKinds")
public List<ProductKind> getProductKinds() {
return productKinds;
}
public void setProductKinds(List<ProductKind> productKinds) {
this.productKinds = productKinds;
}
@DynamoDBTypeConverted(converter = ObjectConverter.class)
@DynamoDBAttribute(attributeName = "Author")
public Author getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
@DynamoDBTypeConverted(converter = ObjectConverter.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 class ObjectConverter<T extends Object>
implements DynamoDBTypeConverter<String, T> {
ObjectMapper objectMapper = new ObjectMapper();
@Override
public String convert(T object) {
try {
return objectMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
throw new IllegalArgumentException("Unable to parse JSON");
}
@Override
public T unconvert(String object) {
try {
T unconvertedObject = objectMapper.readValue(object,
new TypeReference<T>() {
});
return unconvertedObject;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
有人可以帮我解决这个问题吗?
最佳答案
简答:
向 Media 类添加一个公共(public)的空构造函数。
长答案:
在您的代码中,当您执行 databaseController.get(Product.class, id)
时,您正在调用下划线方法 public T unconvert(final Map<String,AttributeValue> object)
的 DynamoDBMapperTableModel :
@Override
public T unconvert(final Map<String,AttributeValue> object) {
final T result = StandardBeanProperties.DeclaringReflect.<T>newInstance(targetType);
if (!object.isEmpty()) {
for (final DynamoDBMapperFieldModel<T,Object> field : fields()) {
try {
final AttributeValue value = object.get(field.name());
if (value != null) {
field.unconvertAndSet(result, value);
}
} catch (final RuntimeException e) {
throw new DynamoDBMappingException(
targetType.getSimpleName() + "[" + field.name() + "]; could not unconvert attribute", e
);
}
}
}
return result;
}
在此方法的第一行中,使用反射创建了表模型的新实例(在您的例子中是 Product
的新实例),然后新实例的字段被转换为所需的类,并且相应地设置。
StandardBeanProperties.DeclaringReflect.<T>newInstance(targetType)
调用 .newInstance()
在 targetType
, 它的类型是 Class<T>
.
写在Class.newInstance() documentation , InstantiationException
如果该类没有 nullary 构造函数,则抛出该异常。还有其他情况会抛出此异常,但根据我的经验,这可能是因为未实现公共(public)空构造函数。
关于java - 亚马逊云数据库 : Could not unconvert attribute error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47926783/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 7年前关闭。 Improve this qu
我已经在我的网站上列出了我所有的亚马逊订单。 现在,我希望能够将订单标记为从我的网站发货,并且状态将在亚马逊上立即更新。 我看过亚马逊提要 api,但不清楚提要 xml 的格式。 我只想要一个用于更新
我想在不经过转换过程(我的内容 --> Epub/Html --> KindleGen/Calibre/其他工具)的情况下生成 KF8,因为我需要更多地控制 kf8 文件的生成。 guidelines
我打算为亚马逊的市场网络服务 (MWS) 开发一个客户端。我的要求是更新订单、同步订单状态、使用他们拥有的 API 获取订单详细信息。 但是,我找不到沙盒环境来测试这些场景。我了解亚马逊有一个支付沙箱
PA-API 的销售已经停止,我想知道这对我来说意味着什么。我喜欢这个 API,但我看不到有自己的网站和购物车等的可能性。 是否有来自 Amazon 的 API 可以将其用于购物车和结账? 只需生成购
我在 salesforce 领域工作,并尝试使用产品 Feed API 在亚马逊卖家账户中创建产品。但我不确定如何为属于珠宝类别的产品创建完美的 xml 提要文件。我可以使用 MWS 客户端库吗?或者
如何使用 Amazon MWS 将内嵌图像添加到注册品牌的产品描述部分还是平面文件? 谢谢! 最佳答案 如果您是注册品牌所有者,则需要使用 enhanced brand content templat
是否可以在一个 aws dynamodb 帐户中创建多个数据库?例如,一个管理大学表格的大学数据库和一个管理学校表格的学校数据库。谢谢。 最佳答案 另一个答案是正确的,但更完整的答案是 DynamoD
我有一个简单的问题,因为没有找到任何答案。实际上,我可以使用亚马逊的 API 从 ASIN 代码中获取有关产品的信息,但在这张图片的情况下,我可以获得一张不同格式的图片,大拇指、中拇指等,对吗? 在我
关于哪个 Web 服务可以上传订单的 pdf 发票? 几周以来,可以通过sellercentral 或第三方软件了解.... 但我找不到有关 mws api 的方法.. 谢谢 最佳答案 也许你应该看看
有没有办法计算通过 amazon redshift 中的 SQL 更新查询影响的最后行数? 类似于 PG_LAST_COPY_COUNT() 之类的函数,用于计算亚马逊 Redshift 中的最后一个
我决定将 MySql 或 NoSQL 用于论坛站点。我对整个 NoSQL 想法很陌生,在阅读文档时我注意到“项目”不能大于 64kb,这包括属性和值。从我理解的方式来看,我能想到的实现这一点的唯一方法
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
我正在创建一个 Alexa 技能,需要检索各种内容,例如日期、文件号等。我还需要它来获取用户对其所说的“描述”并能够保留它。 例如: "Alexa, description, patent draft
我已经用“标题”和“类别”等对我的产品建立了索引。现在,在我的自动建议中,我想要诸如Amazon / Flipkart之类的东西, 例如,如果我查询“绿色”,建议使用“绿茶”,“绿色衬衫”,“男士绿色
我是英国亚马逊(以及同一帐户上的所有欧盟商城)的注册专业卖家 我有我的卖家帐户 ID、开发者 ID、开发者身份验证 token 和私钥。 在 MWS 暂存器中,我可以发出请求并获得状态 API 的成功
我有一个 Web 服务器在 Ubuntu Amazon EC2 实例上运行,端口为 3000。15.0.0.10 是这个 EC2 实例的私有(private) ip。 在我通过 ssh 进入该实例并运
我在 Amazon S3 中使用 GetSessionToken/GetFederationToken 的临时 session ,我计划拥有超过 10K 个用户,每个用户都可以上传到 S3,所以一开始
我在heroku上有一个django应用程序,它提供来自亚马逊s3存储桶的静态文件。我使用 boto 库并按照网站上的指南进行操作。我可以做什么来加快文件传输速度? 部分代码: DEFAULT_FIL
我正在尝试制作一个小Java程序。 该程序有 3 个整数的输入:S:开始的蚊子,K:每只蚊子生下的 child 的数量,N:我们“调查”的天数。 亚马逊地区的每只蚊子只能存活 1 天。第 0 天,我们
我是一名优秀的程序员,十分优秀!