2017-12-20 6 views
0

복잡한 클래스의 변환기 클래스와 열거 형의 두 번째 메서드 인 일반 메서드를 만들었습니다.AWS DynamoDB - 변환기 클래스 - "요청이 잘못되어 JSON을 구문 분석 할 수 없습니다."

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

:

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

이 열거 형 변환기 클래스입니다 : 나는

이 내 컨버터 클래스 복잡 레시피 클래스는 그래서 @DynamoDBTypeConverted (변환 = ObjectConverter.class)를 사용하는이 문제는 내가 CRUDs 메서드를 테스트하려고 할 때 .. addProduct 메서드가 있고이 하나는 잘 작동합니다. addRecipe 메서드를 만들었고 거의 비슷하게 보이지만 Postman에 게시하는 동안 문제가 발생했습니다. 오류가 발생했습니다. "잘못된 요청 , JSON을 구문 분석 할 수 없습니다. " 로그 파일에서

그리고 정보 :

"Can not deserialize instance of java.util.ArrayList out of START_OBJECT token at [Source: {"id":null,"name":"test","labels":["GLUTEN_FREE"],"author":{"name":"Plejer Annołn","id":"testID2"},"media":{"name":"heheszki","url":" http://blabla.pl ","mediaType":"IMAGE"},"recipeElements":{"product":{"id":927c3ed3-400b-433d-9da0-1aa111dce584,"name":"bąkiKacpraNieŚmierdzą","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":"IMAGE"},"approved":false},"weight":"100"},"approved":false}; line: 1, column: 190] (through reference chain: pl.javamill.model.kitchen.Recipe["recipeElements"])"

것은 무엇 잘못 될 수 있는가?

답변

0

Product을 올바르게 마샬링/언 마샬링하지 않아도 변환기 클래스의 메서드는 예외가 throw 된 경우에도 (RuntimeExceptions가 아닌 경우) 항상 값을 반환합니다. RecipeElement 보다 나은 대안은 클래스의 getRecipeElement() 메소드에 @DynamoDBTypeConvertedJson이라는 주석을 달아 즉시 사용할 수있는 JSON 마샬링/언 마샬링 (unmarshaling)을 제공하는 것입니다. 그것은 우편 배달부에서 보내는 HTTP 요청과 관련이있을 수 있습니다. getProduct(), setProduct() 방법 및 실제 우편 발송자 요청 (중요한 정보 없음)에 대한 자세한 정보를 추가해야합니다.

+0

로그 파일에 다음 정보가 있습니다. "com.fasterxml.jackson.databind.JsonMappingException : recipeElement의 START_OBJECT 토큰에서 java.util.ArrayList의 인스턴스를 deserialize 할 수 없습니다" –

+0

@ D.Zet 이 데이터는 일부 이전 데이터에 대한 것으로 판단됩니다. 이 객체가 사용되는 클래스의 내용은 무엇입니까? – Vikdor

+0

안녕하세요, 제 질문을 수정했습니다. 자세한 내용을 확인하시기 바랍니다. –