FAIL_ON_EMPTY_BEANS报错

FAIL_ON_EMPTY_BEANS

错误信息

报错信息如下:

    com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class lb.springboot.v2.server.rscene.model.trigger.UserTrigger$Config and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: lb.springboot.v2.server.rscene.model.TaskConfig["trigger"]->lb.springboot.v2.server.rscene.model.trigger.UserTrigger["config"])
	at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)
	at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1300)
	at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)
	at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:46)
	at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:29)
	at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)
	at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:774)
	at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeWithType(BeanSerializerBase.java:657)
	at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:730)
	at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:774)
	at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
	at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
	at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
	at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4568)
	at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3821)
        ···

对应的类信息如下:

package lb.springboot.v2.server.rscene.model.trigger;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class UserTrigger implements Trigger<UserTrigger.Config> {
    private Integer type;
    private Config config;

    @Data
    public static class Config {

    }

}

报错原因

在软件开发过程中,序列化和反序列化是常见的操作。Jackson 库是 Java 中常用的序列化和反序列化工具之一,在上述代码中就是使用的Jackson工具。
然而,当遇到空对象时,如上述代码中的Config对象,就出报出异常SerializationFeature.FAIL_ON_EMPTY_BEANS

SerializationFeature.FAIL_ON_EMPTY_BEANS 是 Jackson 库中的一个序列化特性。当启用此特性时,
如果尝试序列化一个没有任何属性的空对象(即仅包含默认构造函数的对象),Jackson 会抛出异常。这对于某些应用场景来说可能是一个问题,特别是当我们期望处理空对象时。

解决方法

解决该问题我们可以在被序列化的类上使用@JsonIgnoreProperties、@JsonIgnore、@JsonIgnoreType等注解,或者禁用SerializationFeature.FAIL_ON_EMPTY_BEANS;

使用注解解决

使用@JsonIgnoreProperties注解

// 在实体类上面加上注解:
@JsonIgnoreProperties(value = {"config"})

使用@JsonIgnore注解

//在对应属性上加注解
@JsonIgnore
private Config config;

使用@JsonIgnoreType注解

    @JsonIgnoreType
    public static class Config {
    }

禁用SerializationFeature.FAIL_ON_EMPTY_BEANS

设置Jackson,关掉FAIL_ON_EMPTY_BEANS

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.context.annotation.Bean;

import org.springframework.stereotype.Component;

@Component
public class ObjectMapperConfiguration {
    @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    }
}

使用另一种方法,application.yml中关掉FAIL_ON_EMPTY_BEANS;

spring:
        jackson:
            serialization:
                FAIL_ON_EMPTY_BEANS: false
posted @ 2025-06-05 21:10  joudys  阅读(135)  评论(0)    收藏  举报