Java教程

SpringBoot:redis存储报错 Cannot serialize;com.fasterxml.jackson.databind.exc.InvalidDefinitionException;

本文主要是介绍SpringBoot:redis存储报错 Cannot serialize;com.fasterxml.jackson.databind.exc.InvalidDefinitionException;,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Cannot serialize;

org.springframework.data.redis.serializer.SerializationException: Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type
 ==[com.lightseablue.bookwebsite.entity.TableAllTypes$TableAllTypesBuilder]==

	at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:96)
	at org.springframework.data.redis.core.AbstractOperations.rawValue(AbstractOperations.java:127)
	at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:235)
	at com.lightseablue.bookwebsite.BookwebsiteApplicationTests.testRedis(BookwebsiteApplicationTests.java:85)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)
	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)

问题

  1. 实体类没有实现序列化接口
  2. 图中的错误:使用了lombok组件的builder,导致获取不到序列化

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class

即使使用了序列化还是报错,这里用的是杰克逊

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.lightseablue.bookwebsite.entity.TableAllTypes$TableAllTypesBuilder and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

问题

springboot项目中定义了很多类,我们在rest返回中直接返回或者在返回对象中使用这些类,spring已经使用jackson自动帮我们完成这些的to json。但是有时候自动转的json内容太多,或者格式不符合我们的期望,因此需要调整类的to json过程,或者说希望自定义类的json过程。

解决办法:

使用@JsonIgnoreProperties、@JsonIgnore、@JsonFormat。

@JsonIgnore注解用来忽略某些字段,可以用在变量或者Getter方法上,用在Setter方法时,和变量效果一样。这个注解一般用在我们要忽略的字段上。

@JsonIgnoreProperties(ignoreUnknown = true),将这个注解写在类上之后,就会忽略类中不存在的字段。这个注解还可以指定要忽略的字段,例如@JsonIgnoreProperties({ “password”, “secretKey” })

@JsonFormat可以帮我们完成格式转换。例如对于Date类型字段,如果不适用JsonFormat默认在rest返回的是long,如果我们使用@JsonFormat(timezone = “GMT+8”, pattern = “yyyy-MM-dd HH:mm:ss”),就返回"2018-11-16 22:58:15"

这篇关于SpringBoot:redis存储报错 Cannot serialize;com.fasterxml.jackson.databind.exc.InvalidDefinitionException;的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!