spring security oauth2 集成异常处理

  1. Java 8 date/time type java.time.Instant not supported by default:

自己new的ObjectMapper对象没有注册JavaTimeModule。

解决方法:

java 复制代码
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
  1. 刷新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;
    }
相关推荐
数智启示录2 分钟前
Apache Kafka Consumer 扩到 40 个仍不提速:Partition 上限锁死有效并行度 【Kafka合集】
数据库·经验分享·分布式·缓存·面试·kafka·apache
Zzzzmo_6 分钟前
Spring MVC
java·spring·mvc·cookie/session
数智启示录8 分钟前
Apache Kafka 幂等 Producer 的边界:Exactly-Once 到了 MySQL 为什么失效 【Kafka合集】
数据库·经验分享·分布式·mysql·面试·kafka·apache
cfm_29149 分钟前
Spring核心设计模式
java·spring·设计模式
Java小白笔记10 分钟前
Java 实现阿里云 OSS 文件上传链路:普通上传、秒传、分片与断点续传
java·开发语言·数据库·spring·阿里云
—Miss. Z—11 分钟前
计算机三级数据库技术—填空题
数据库·mysql
数智启示录36 分钟前
Apache Kafka 同 Key 仍会乱序:从分区 Offset 到业务可见的四道边界 【Kafka 合集】
大数据·数据库·经验分享·分布式·面试·kafka·apache
烬羽1 小时前
给 Agent 一个检索式记忆:把对话历史存进 Milvus,该记的都记得
javascript·数据库·agent
星云API技术支持1 小时前
企业微信二次开发外部群:群聊数据与联系人信息如何建立关联
数据库·php·企业微信
我不是程序员三三1 小时前
桌面管理软件哪个最好?从一次上线翻车事故,拆解选型评估与配置落地全流程
数据库