2017-04-10 2 views
0

파트너 API가 아직 제대로 작동하지 않는 상황이 있습니다. 내가받을 목적은 필요한 솔루션 JsonMappingException를 기록하고 DB에 저장하고, 객체를 충돌하지 않는 것입니다이JsonMappingException 우리가 할 수있는 모든 것을 처리하고 비 순차적으로 처리하십시오.

{ 
    "id": 1,   // Can deserealize 
    "type": "HUMAN", // Can deserealize 
    "age": 18,  // Can deserealize 
    "armor": {},  // JsonMappingException 
    "weapon": {}  // Can deserealize 
} 

같은 것입니다하지만 결과에 직렬화 할 수없는 객체 대신 값을 넣어.

{ 
    "id": 1,   // Can deserealize 
    "type": "HUMAN", // Can deserealize 
    "age": 18,  // Can deserealize 
    "armor": null, // Replaced to null or default object 
    "weapon": {}  // Can deserealize 
} 

있는 방법은 발사되지 않았다 DeserializationProblemHandler- 나는 추가하려고하고 DeserializationFeature는 - 내가 필요 같은 어떤 기능이 존재하는 것으로 보인다.

어떻게이 동작을 모든 개체에 적용 할 수 있도록 Jackson의 동작을 특수화 할 수 있습니까? 그래서 어떤 필드도 매핑 할 수 없으면이를 처리하고 null 또는 기본 개체로 바꿀 수 있습니까?

+0

비 직렬화 코드를 공유 할 수 있습니까? –

+0

'ObjectMapper mapper = new ObjectMapper(); Player player = null; 시도 { \t 플레이어 = mapper.readValue (새 파일 ("bad_json.txt"), Player.class); } catch (IOException e) { \t log.error ("Bad json", e); }'일부 클래스에는 JsonMappingException을 던지는 디시리얼라이저가 있습니다. –

+0

질문에 추가 할 수 있습니까? 또한'Player' 클래스의 구조를 추가 할 수 있습니까? –

답변

0

이것은 업무용 케이스보다 Jackson 특정 동작처럼 보입니다. 또한 자바에서는 Exception을 던지고 동시에 value을 반환하는 메서드를 사용할 수 없습니다.

대신 (완전히 불필요) 사용자 정의 디시리얼라이저를 작성, 당신은 직렬화 복원 후 해당 필드를 확인할 수하고, 예컨대 :

String json = ""; //json string 
ObjectMapper mapper = new ObjectMapper(); 
Person person = mapper.readValue(json, Person.class); 
if(person.getArmour() == null) { 
    LOGGER.error("Received a Person object witn no armour : {}", person.getId()); 
} 
//Save Person object 

P.S. 객체를 지속하기 전에, 널 (null) 인 경우 오류를 기록 위 예에서는 slf4j을 사용합니다.

+0

갑옷 개체를 역 직렬화 할 때'mapper.readValue (json, Person.class); '가 JsonMappingException을 throw하기 때문에 Person 개체를 가져올 수 없습니다. –

+0

'Person' 클래스 구조 및/또는 deserialization 로직을 추가 할 수 있습니까? 'armour'가 null의 경우, JsonMappingException를 슬로우 할 필요는 없다고 생각합니다. –

+0

질문을 보면 갑옷이 JsonMappingException을 던졌습니다. 그리고 나는 그것을 붙잡고, 기록하고, 갑옷을 null로 대체하기를 원합니다. –