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

浙公网安备 33010602011771号