Jackson快速替换Fastjson,Cannot construct......cannot deserialize

一· 概述

Fastjson已经连续几次爆出高危漏洞,和Structs一样,每次影响范围都比较广,殃及几乎所有的JAVA后台系统。为避免以后频繁地应急处理Fastjson的安全漏洞,痛定思痛,决定放弃Fastjson转投jackson的怀抱了。

二· 快速替换

2.1 加入依赖

在pom文件中添加jackson的依赖包,如下:

    
        2.9.9
    
    ...

    
        
            
            
                com.fasterxml.jackson.core
                jackson-core
                ${jackson-version}
            
            
                com.fasterxml.jackson.core
                jackson-databind
                ${jackson-version}
            
            
                com.fasterxml.jackson.core
                jackson-annotations
                ${jackson-version}
            
            ...

2.2 替换方法

将java对象转换成json字符串

Jackson

ObjectMapper objectMapper = new ObjectMapper();  

String json =objectMapper.writeValueAsString(obj);  

return json; 

FastJson

return JSON.toJSONString(object); 

json字符串转换为相应的JavaBean对象

Jackson

ObjectMapper objectMapper = new ObjectMapper();  
   
Object vo = objectMapper.readValue(json, cls);  
  
return vo;

FastJson

return JSON.parseObject(jsonStr, valueType);

三、应用报错

报错如下:

Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.aspire.commons.idgenerator.zookeeper.ZkNode` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
 at [Source: (String)"{"hostName":"sz-chenyuanyao.aspire.aspire-tech.com","ip":"192.168.64.1","pid":"16440","sessionId":72057600293011457,"workerId":0}"; line: 1, column: 2]

翻译如下:

由于:com.fasterxml.jackson.databind.exc.invalidDefinitionException:无法构造'com.aspire.commons.idGenerator.zookeeper.zknode'的实例(不存在创建者,如默认构造):无法从对象值反序列化(不存在委托创建者或基于属性的创建者)

在[来源:(字符串)“”hostname“:”sz chenyuyao.aspire.aspire-tech.com“,”ip“:”192.168.64.1“,”pid“:”16440“,”sessionid“:72057600293011457,”workerid“:0”行:1,列:2]

主要错误:

构造对象失败、反序列化失败

解决:

1、在实体类中补上一个无参构造器

2、在实体类中添加以下注解即可解决。

@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"})

3、可能是版本不兼容的问题,JACKSON版本为2.2.3,而用的Spring版本为5.0.0.RELEASE,换成4.1.9.RELEASE的就行了。

 

参考:

Jackson快速替换Fastjson之道:http://www.easysb.cn/2019/07/482.html

fastjson和jackson JSON转换实践:https://bijian1013.iteye.com/blog/2319159

Jackson的json转换:https://dengwenwei121.iteye.com/blog/2187506

你可能感兴趣的:(bug)