com.fasterxml.jackson.databind.exc.InvalidDefinitionException的解决方案

今天才研究完注解,就遇到了和注解有关的问题。算是巧合吗?

具体问题是这样的,还是上次那个项目,这次又有人打不开了。然后报错是这样的:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.example.cinema.po.DateLikeForm and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.example.cinema.vo.ResponseVO["content"]->java.util.ArrayList[0])

这是啥,Jackson序列化失败?前端的报错就一个500,没啥帮助,问题还是出在后端上。你说我一个前端,怎么就过来帮后端debug了呢?算了。既然问题出在Jackson上,那不如先按照编译器的指示,把那个什么SerializationFeature关掉试试:

spring:
  jackson:
    serialization:
      FAIL_ON_EMPTY_BEANS: false

嗯,报错倒是不报错了,前端显示的值却变成了undefined。作为前端,我立刻意识到了事情的严重性:后端的数据根本没有传过来,不是什么序列化错误。

检查了一下代码,似乎并没有什么问题,只是我想吐槽一下,这Lombok用得也太懒了,写个Getter/Setter能咋的,不就多两行代码吗?

@Data
public class DateLikeForm {
    // 人数
    private int likeNum;

    // 时间
    private Date likeTime;
}

我在网上查的时候,看到有某位老哥说把private换成public就好了。我有点想笑,这@Data的目的不就是为了替代Getter/Setter吗?都有了Getter/Setter,还要什么public。等会,Getter/Setter?我突然想起,上一个项目曾经因为没写Getter/Setter带来的不愉快的经历。想着想着,我的脸色就黑了下来。事不宜迟,赶紧试试:

public class DateLikeForm {
    // 人数
    private int likeNum;

    // 时间
    private Date likeTime;

    public int getLikeNum() {
        return likeNum;
    }

    public void setLikeNum(int likeNum) {
        this.likeNum = likeNum;
    }

    public Date getLikeTime() {
        return likeTime;
    }

    public void setLikeTime(Date likeTime) {
        this.likeTime = likeTime;
    }
}

OK,问题解决。本质原因就是后端根本没有拿到数据库里的数据。但是问题又来了,为什么用Lombok就拿不到数据呢?我继续研究了下去,然后突然发现启动的时候会有一段文字一闪而过。那是啥?随后,我在message里找到了它:

java: lombok.javac.apt.LombokProcessor could not be initialized. Lombok will not run during this compilation: java.lang.IllegalArgumentException...

看样子是Lombok根本就没导入,所以导致了一系列的问题。但是明明能正常启动,IDE也没报错啊?而且,我本地跑得好好的,到了这里咋就出问题了呢?想不通。

再查了一下,发现了一篇文章

”如果 IDEA 中已安装 Lombok 插件,并且在项目中开启了注解处理,就能够正常解析 Lombok 注解。但是很遗憾的是,无法直接在 IDEA 中使用 JDK 9 构建。

解决方法一:降低jdk版本

解决方法二:需采用将构建与运行委托给 Gradle 的方式。“

我的脸再次黑了下来。是这样吗?再一问,果然,用的JDK11。不过为了这个就把Maven换成Gradle,或者降低JDK版本,也太不人道了。一定有什么更好的办法。参考上次遇到的问题,要不换个版本试试?看了一下,项目里用的是这个:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.20</version>
</dependency>

去Maven仓库查了一下。

在这里插入图片描述

而Java11发布的消息是在2018年3月,正式发布都到9月了,2018年1月发布的Lombok能兼容就有鬼了。赶紧换个版本。

OK,问题解决。话说Java8有什么不好的……

### 回答1: "com.fasterxml.jackson.databind.exc.InvalidDefinitionException" 是 Jackson 框架中的一个异常,表示 Java 对象的定义不正确或不符合 Jackson 序列化/反序列化的要求。通常是由于缺少字段的 getter/setter 方法、字段注解不正确等原因造成的。 ### 回答2: com.fasterxml.jackson.databind.exc.invaliddefinitionexception是一种Jackson框架的异常。这个异常通常出现在序列化或反序列化Java对象到JSON(或XML)格式时,表明Jackson无法识别或处理某些属性或类型。 最常见的原因是Java类中的属性没有正确地映射到对应的JSON属性。这可能是因为Java属性名和JSON属性名不相同,或者在Java类中没有为某个属性指定getter或setter方法,导致Jackson无法访问该属性。 另一个可能的原因是Java类中包含不受支持的属性类型。例如,如果Java属性指定为某个自定义Java类的实例(而非预定义的Java类或包装类型),Jackson可能无法正确地序列化或反序列化它。 在处理这个异常时,需要检查Java类和JSON格式之间的映射是否正确,并确保Java类中的所有属性均正确映射到JSON格式中。此外,还可以使用Jackson的自定义序列化和反序列化器,以指定如何处理不受支持的属性类型。这些操作可以帮助解决这个异常,以确保Java对象可以成功地序列化为JSON格式,或者从JSON格式反序列化为Java对象。 ### 回答3: com.fasterxml.jackson.databind.exc.invaliddefinitionexception 异常是由于 Jackson 数据绑定库在解析 JSON 数据时,无法识别或解析 JSON 数据中的某些字段或数据类型而抛出的异常。这个异常通常发生在以下几种情况下: 1. JSON 数据中存在无法识别的字段或属性名称。 2. JSON 数据中的某些属性与 Java 类型的属性不匹配。 3. JSON 数据中的属性值类型无法转换为 Java 类型。 4. 在序列化和反序列化 Java 对象时,没有正确配置类的属性和访问器方法。 要解决 com.fasterxml.jackson.databind.exc.invaliddefinitionexception 异常,可以采取以下措施: 1. 在 JSON 数据中移除无法识别的字段或属性名称。 2. 确保使用 Jackson 注解及配置正确地映射 JSON 数据属性名称到 Java 类型属性。 3. 检查 JSON 数据中的属性值类型与 Java 类型是否匹配。 4. 将 Java 类型属性和访问器方法正确配置和标记。 另外,Jackson 数据绑定库还提供了一个异常处理器,可以在遇到这类异常时进行处理和输出日志。处理方式可以是自定义处理或采取 Jackson 库提供的默认处理方式。在开发过程中,应该尽量避免出现 com.fasterxml.jackson.databind.exc.invaliddefinitionexception 异常,以确保数据绑定的正确性和完整性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值