jackson 发生异常错误(发生错误时为java.lang. null指针异常)

zd287kbt  于 2022-11-09  发布在  Java
关注(0)|答案(5)|浏览(219)

我一直在寻找这个问题,但没有找到任何答案,所以要么我错过了一些如此明显的东西,没有人写任何关于它,要么我遇到了一个不寻常的问题。我希望这是第一个...
我正在使用第三方库(IDMLlib)从以.idml格式存储的Adobe InDesign文档中提取信息。内容易于读取,并存储在“Idml”类型的对象中,该对象包含我所需的所有内容。现在,我想使用Jackson JSON将此对象发送到Web客户端(浏览器)。
我遇到了两个问题:
1)对象树中充满了循环引用。我已经通过使用混合和注解修复了这个问题

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

所以现在我已经准备好了很多混合,如果问题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没有帮助。
是否有一个注解,我可以在我的混合使用,处理这一点?
或者有没有其他方法可以序列化这个对象?

guz6ccqo

guz6ccqo1#

你是对的,Double可以处理 null 值,而double不能。在我的例子中,我的属性是Long类型,但是getter返回的是long值而不是Long值。只要值不是 null,这是可以接受的。但是当值是 null 时,jackson无法序列化longnull 值。
只需将getter更改为返回Long而不是long即可修复它。验证您的getter是否返回Double而不是您的示例中的double
ps:我知道这个问题很老了,但是因为我也有同样的问题,而且这个问题在谷歌答案中排名第二......似乎晚回答比不回答更公平

wfsdck30

wfsdck302#

我不知道这是否仍然有效,但是,我通过改变com.fasterxml.jackson.dataformat:jackson-dataformat-yaml的版本解决了这个问题。之前我使用的是2.3.0,也得到了同样的错误。我把它改为2.7.8,现在它工作正常。

rhfm7lfc

rhfm7lfc3#

我在从1.5升级到2.4.1后遇到了同样的问题,问题是在调用GET请求时,其中一个字段没有被序列化。之前的代码如下所示(在 Spring 启动升级之前)

@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 启动升级后,上述代码段(通过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
    }

现在一切正常

yvgpqqbh

yvgpqqbh4#

我在一个类上遇到了一个NullPointerException,在这个类上,我用@ com. fasterxml. jackson. annotation. JsonCreator标记了构造函数。当我删除这个标记时,反序列化json -〉mojo工作了。

q3qa4bjr

q3qa4bjr5#

转换前始终检查:-
if(node.get("id")!=null) { int id = (Integer) ((IntNode)node.get("id")).numberValue();}
有可能你的json不包含任何键。那么它将抛出空指针异常。所以最好先检查空值。

相关问题