版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_38004638/article/details/98612807
Fastjson已经连续几次爆出高危漏洞,和Structs一样,每次影响范围都比较广,殃及几乎所有的JAVA后台系统。为避免以后频繁地应急处理Fastjson的安全漏洞,痛定思痛,决定放弃Fastjson转投jackson的怀抱了。
在pom文件中添加jackson的依赖包,如下:
<properties>
<jackson-version>2.9.9</jackson-version>
</properties>
...
<dependencyManagement>
<dependencies>
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson-version}</version>
</dependency>
...
Jackson
ObjectMapper objectMapper = new ObjectMapper();
String json =objectMapper.writeValueAsString(obj);
return json;
FastJson
return JSON.toJSONString(object);
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的就行了。