AWS DynamoDB - 转换器类 - “错误请求,无法解析JSON”

时间:2017-12-20 08:35:53

标签: java json string amazon-web-services amazon-dynamodb

我已经创建了一个泛型方法,它是复杂类的转换器类,第二个是枚举类。我有复杂的Recipe类,所以我使用@DynamoDBTypeConverted(converter = ObjectConverter.class)

这是我的转换器类:

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;
}

这是枚举的转换器类:

public class EnumConverter<T extends Object> implements DynamoDBTypeConverter<String, List<T>> {

@Override
public String convert(List<T> 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<T> unconvert(String objectsString) {
    ObjectMapper objectMapper = new ObjectMapper();
    try {
        List<T> objects = objectMapper.readValue(objectsString, new TypeReference<List<T>>() {
        });
        return objects;
    } catch (JsonParseException e) {
        //do something
    } catch (JsonMappingException e) {
        //do something
    } catch (IOException e) {
        //do something
    }
    return null;
}

问题是当我尝试测试CRUD方法时..我有addProduct方法,这个工作正常,我创建了addRecipe方法,它看起来几乎一样,但是这里我在Postman中发帖时遇到问题我收到了一个错误: “错误的请求,无法解析JSON”。

来自日志文件的信息:

  

“无法在[来源:{”id“:null,”name“:”test“,”labels“:[”GLUTEN_FREE“],”author“中的START_OBJECT标记中反序列化java.util.ArrayList的实例) :{“name”:“PlejerAnnłn”,“id”:“testID2”},“media”:{“name”:“heheszki”,“url”:“http://blabla.pl”,“mediaType”:“ IMAGE “},” recipeElements “:{” 产品 “:{” ID “:927c3ed3-400b-433d-9da0-1aa111dce584,” 名 “:” bąkiKacpraNieŚmierdzą “ ”卡路里“:1000, ”胖“:400.0,” 羰“:20.0,”蛋白质“:40.0,”productKinds“:[”MEAT“],”作者“:{”名称“:”PlejerAnnłn“,”id“:”testID2“},”媒体“:{”名称“:” heheszki”, “URL”: “http://blabla.pl”, “mediaType的”: “IMAGE”}, “批准”:假}, “重量”: “100”}, “批准”:假}; line:1,column:190](通过引用链:pl.javamill.model.kitchen.Recipe [“recipeElements”])“

有什么不对?

1 个答案:

答案 0 :(得分:0)

转换器类中的方法总是返回一个值,即使抛出异常(除非它们是RuntimeExceptions),尽管它们可能无法正确地编组/解组Product中的RecipeElement。更好的选择是使用@DynamoDBTypeConvertedJson在类中注释getRecipeElement()方法,该方法提供开箱即用的JSON编组/解组。这可能与您在Postman中发送的HTTP请求有关。您应该添加有关getProduct()setProduct()方法和实际邮递员请求的更多信息(不包含任何敏感信息)。