2012-10-08 2 views
2

잠시 동안이 문제를 조사해 보았지만 답변을 찾지 못했습니다. 너무 분명한 사람이 아무 것도 쓰지 않았거나 아무 것도 쓰지 않았습니다. 비정상적인 문제가 발생했습니다. 나는 그것의 첫 번째 희망입니다 ...JsonMappingException (was java.lang.NullPointerException)

.idml 형식으로 저장된 Adobe InDesign 문서에서 정보를 추출하는 타사 라이브러리 (IDMLlib)로 작업하고 있습니다. 내용은 "Idml"유형의 객체에 쉽게 읽고 저장할 수 있습니다.이 객체에는 필요한 모든 것이 들어 있습니다. 이제 Jackson JSON을 사용하여이 객체를 웹 클라이언트 (브라우저)로 보내려고합니다.

1) 객체 트리가 원형 referefences이 가득 :

나는이 문제를 공격했습니다. 문제 2.

2) 새로운지고 유지를 위해 필요한 경우 나, 지금은 준비가 믹스 인을 많이 가지고

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id") 

그래서 주석과 믹스 인을 사용하여이 문제를 해결했습니다 직렬화 할 때 객체 별 오류.

--Output from testMethodsReturnsSomething-- 
| Failure: testMethods(package.IdmlServiceTests) 
| com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: de.fhcon.idmllib.api.elements.Idml["document"]->de.fhcon.idmllib.api.elements.Document["tags"]->de.fhcon.idmllib.api.elements.tags.Tags["xmltagList"]->java.util.ArrayList[0]->de.fhcon.idmllib.api.elements.tags.XMLTag["tagColor"]->de.fhcon.idmllib.api.elements.typedefs.InDesignUIColorType["greenValue"]) 
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:218) 
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:183) 
at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:155) 
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:533) 
... 

사용자 지정 NullValue/NullKey serializer를 작성하려고했지만 NullPointerException에 도움이되지 않습니다.

이것을 처리하는 믹스 인에서 사용할 수있는 특수 효과가 있습니까?
또는이 개체를 serialize 할 다른 방법이 있습니까?

+0

아아보다 그 답을 공정 듯 원래 NPE에 더 가까운 스택 트레이스의 부분. 이 부분은'RuntimeException'을 rethrow하는 catch 절을 가리키고 있습니다. 그것을 모른 채, 그것을 피하기 위해 무엇을해야하는지 말할 수는 없습니다. – StaxMan

+2

"greenValue"속성이 double이 아닌 Double 유형이므로, null 값을 가질 수도 있습니다. Double은 null 값을 처리 할 수 ​​있지만 double은 처리 할 수 ​​없습니다. 내 이론은 Jackson JSON이 충돌을 일으키는 원시 데이터 유형으로 액세스하려고 시도한다는 것입니다. 그래도 그것에 대해 무엇을해야할지 모르겠다. – Steffen

+1

이것은 처리시 발생할 수있는 버그처럼 들리므로 Jackson에 버그를 신고하는 것이 좋습니다. 원시 타입을 다루는 대부분의 핸들러는 null 값을 기본값 (0.0d)으로 강요하지만 Object Id 핸들러는 적절한 예방 조치를 취하지 않거나 setter/field access가 문제를 유발할 수 있습니다. Java는 많은 경우 자동 언 래핑을 수행합니다. – StaxMan

답변

7

맞습니다. Doublenull 값을 처리 할 수 ​​있으며 double은 처리 할 수 ​​없습니다. 제 경우, 제 재산이 Long 이었지만, getter가 long 값을 반환했지만 Long 값이 아닙니다. 이 값이 null이 아닌 한 허용되었습니다. 그러나 값이 null 일 때 jackson은 null 값을 long으로 serialize 할 수 없습니다.

게터를 long 대신 Long을 반환하도록 변경하면됩니다. getter가 Double을 반환하고 double을 반환하지 않는지 확인하십시오.

추신 :이 질문은 꽤 오래 알고 있지만 나도 같은 문제가되고 문제는 구글의 답변에 2 때부터 ... 나중에 정말 필요한 것을 결코

관련 문제