JsonMappingException(是java.lang.NullPointerException)

时间:2012-10-08 09:53:37

标签: java json nullpointerexception jackson idml

我一直在寻找这个问题但是没有找到任何答案,所以要么我错过了一些如此明显的东西,没有人写过任何关于它的东西,或者我遇到了一个不寻常的问题。我希望这是第一次......

我正在使用第三方库(IDMLlib)从以.idml格式存储的Adobe InDesign文档中提取信息。内容很容易读取并存储在“Idml”类型的对象中,其中包含我需要的所有内容。现在,我想使用Jackson JSON将此对象发送到Web客户端(浏览器)。

我遇到了两个问题:

1)对象树中充满了圆形的引用。我通过使用带注释的混合输入

来解决这个问题
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id")  

所以现在我已经准备好了很多Mix-ins,如果问题2需要的话。

2)序列化时,我不断收到新的特定于对象的错误。

--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序列化程序,但这对NullPointerException没有帮助。

我可以在我的Mix-ins中使用注释来处理这个问题吗? 或者我有另一种方法来序列化这个对象吗?

3 个答案:

答案 0 :(得分:13)

您是对的,Double可以处理 null 值,而double则不能。 就我而言,我的属性属于Long类型,但getter返回long值,而不是Long值。只要值不是 null ,这是可以接受的。但是当值 null 时,jackson无法序列化long null 值。

只需更改getter即可返回Long而不是long来修复它。 验证您的获取者是否在您的案例中返回Double而不是double

ps:我知道这个问题已经很老了但是因为我遇到了同样的问题而且问题在Google答案中排在第二位......看起来很公平地回答它而不是

答案 1 :(得分:2)

我不知道这是否仍然有效,但我通过更改com.fasterxml.jackson.dataformat:jackson-dataformat-yaml的版本解决了该问题。早些时候我使用的是2.3.0,并且遇到了同样的错误。我将其更改为2.7.8,现在可以正常工作。

答案 2 :(得分:0)

从 1.5 升级到 spring boot 2.4.1 后,我遇到了同样的问题,问题是其中一个字段在调用 GET 请求时没有被序列化。之前这段代码看起来像下面(在spring boot升级之前)

@Bean
    public RepositoryRestConfigurer getRestConfigurer() {
        return new RepositoryRestConfigurerAdapter() {
            @Override
            void configureJacksonObjectMapper(ObjectMapper objectMapper) {
                super.configureJacksonObjectMapper(objectMapper)
                def validationResponseSerializerUtil = new ValidationResponseSerializerUtil()
                def simpleModule = validationResponseSerializerUtil.getSerializeModule()
                objectMapper.registerModule(simpleModule)
                objectMapper.enable(SerializationFeature.INDENT_OUTPUT)
            }
        }
    }

但是在spring boot升级后,上面的一段代码(通过RepositoryRestConfigurer序列化ValidationResponse)不起作用,用下面的代替

@Bean(name = "objectMapper")
    ObjectMapper objectMapper() {
        def validationResponseSerializerUtil = new ValidationResponseSerializerUtil()
        def simpleModule = validationResponseSerializerUtil.getSerializeModule()
        ObjectMapper objectMapper=new ObjectMapper()
        objectMapper.registerModule(simpleModule)
        objectMapper.enable(SerializationFeature.INDENT_OUTPUT)
        return objectMapper
    }

现在一切正常