- Java 8 date/time type
java.time.Instantnot supported by default:
自己new的ObjectMapper对象没有注册JavaTimeModule。
解决方法:
java
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
- 刷新token时,反序列化对象异常
异常可能有:
shell
The class with java.lang.Long and name of java.lang.Long is not in the allowlist
相关对象添加注解
java
@JsonDeserialize
@JsonIgnoreProperties(ignoreUnknown = true)
第二个注解使反序列化时忽略没有的属性
shell
Unexpected token (START_OBJECT), expected START_ARRAY:need Array value to contain `As.WRAPPER_ARRAY` type information for class java.util.Map
...
you can also enable default typing.
这是由于序列化和反序列化策略不一致导致的。
- WRAPPER_ARRAY:以数组的方式,Class Type 为第一个元素,Json字符串为第二个元素。
json
[
"info.leve.******.Person",
{
"name": "leve",
"age": 18
}
]
- WRAPPER_OBJECT:以对象的形式,Class Type 为key, Json字符串为value。
json
{
"info.kleven.******.Person": {
"name": "kleven",
"age": 18
}
}
- PROPERTY: 以属性的的方式,在Json字符串中体现为:"@class"为key,Class Type 为value。
json
{
"@class": "info.kleven.******.Person",
"name": "kleven",
"age": 18
}
- EXISTING_PROPERTY: 序列化后的字符串不包含Class Type。
json
{
"name": "kleven",
"age": 18
}
spring security 使用的是PROPERTY方式,下面设置反序列化参数:
java
/**
* 保存token的service
* @return 实例
*/
@Bean
public OAuth2AuthorizationService authorizationService() {
var service = new JdbcOAuth2AuthorizationService(jdbcOperation, registeredClientRepository);
JdbcOAuth2AuthorizationService.OAuth2AuthorizationRowMapper rowMapper =
new JdbcOAuth2AuthorizationService.OAuth2AuthorizationRowMapper(registeredClientRepository);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
//以属性的的方式,在Json字符串中体现为:"@class"为key,Class Type 为value。
objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(),
ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
rowMapper.setObjectMapper(objectMapper);
service.setAuthorizationRowMapper(rowMapper);
return service;
}