java.lang.IncompatibleClassChangeError: (在将包含LocalDateTime字段类型的Java对象转化为Json字符串时,报异常)

本文介绍了一种在Java中将包含LocalDateTime字段的对象转换为Json字符串时遇到的问题及解决方案。通过更换使用的JSON库,从com.alibaba.fastjson.JSONObject改为org.json.JSONObject,成功避免了转换异常,实现了正确转化。

问题背景:在将包含LocalDateTime字段类型的Java对象转化为Json字符串时,转换异常

package com.java.test;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.development.centre.core.entity.News;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class test {

    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        String today = DateTimeFormatter.ofPattern("yyyy-MM-dd [HH:mm:ss]").format(now);


        News news = new News(today, 1, true, false, false,
                false, false, 1, now, 0, "0", "0", 1);

        System.out.println(JSON.toJSONString(news));
        System.out.println(JSONObject.toJSONString(news));

    }
}

上面是报错代码,下面是报错信息:

 

解决方法:
将JSON(com.alibaba.fastjson.JSONObject)包改为其他资源包路径,比如JSON(org.json.JSONObject)即可

替换后效果:

package com.java.test;

import org.json.JSONObject;
import com.development.centre.core.entity.News;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class test {

    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        String today = DateTimeFormatter.ofPattern("yyyy-MM-dd [HH:mm:ss]").format(now);

        News news = new News(today, 1, true, false, false,
                false, false, 1, now, 0, "0", "0", 1);

        System.out.println(new JSONObject(news).toString());

    }
}

运行后效果:

 

java.lang.IncompatibleClassChangeErrorJava 运行环境中的一种错误,表明某个类已经被修改,导致其不再与预期的类结构兼容。对于涉及 org.bouncycastle.asn1.ASN1Encodable 类的该异常,可参考以下可能的解决办法: ### 检查库版本兼容性 确保项目中使用的 Bouncy Castle 库版本是兼容的。不同版本的库可能会对类和接口的定义有所修改,如果版本不匹配,就可能导致该异常。更新相关库到兼容的版本,可在项目的依赖管理文件(如 Maven 的 pom.xml 或 Gradle 的 build.gradle)中指定统一且兼容的版本。 ```xml <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.70</version> <!-- 选择合适的版本 --> </dependency> ``` ### 检查接口或父类定义 此异常可能是由于接口或父类被修改导致的。如果应用程序依赖于某个库中的一个类,而这个类实现了某个接口或者继承自某个父类,当更新这个库后,如果接口或父类的定义发生了改变(比如方法签名被修改或删除),那么在运行就会抛出 IncompatibleClassChangeError。检查 org.bouncycastle.asn1.ASN1Encodable 类及其相关接口或父类的定义,确保它们没有被意外修改[^3]。 ### 检查方法签名 如果一个类的方法(尤其是被子类覆盖或由其他类引用的方法)的签名被更改(例如,更改了参数类型或返回类型),这也会导致该错误。检查涉及 org.bouncycastle.asn1.ASN1Encodable 类的方法签名是否有修改,如果有,需要相应地调整代码[^3]。 ### 检查 JDK 版本一致性 确保类被编译使用的 JDK 版本与运行环境的 JDK 版本一致。如果代码是在较高版本的 JDK 上编译的,然后尝试在较低版本的 JDK 上运行,可能会因为使用了较低版本不支持的特性而导致此错误。检查项目的编译和运行环境,统一 JDK 版本[^3]。 ### 检查类加载器问题 不同的类加载器加载了同一个类的两个不同版本,尽管它们的全限定名相同,但 JVM 会视为不同的类,这可能导致类之间的不兼容。检查项目中是否存在多个类加载器加载了不同版本的 Bouncy Castle 库,确保只有一个版本被加载[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值