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;
    }
相关推荐
派小心.4 分钟前
网站统计采样数据的误差核对
大数据·服务器·前端·数据库·人工智能·小程序·数据分析
龙腾AI白云33 分钟前
数字孪生、具身智能、世界模型三者交叉
数据库·人工智能·机器学习·flask·pygame
SelectDB技术团队1 小时前
Apache Doris 基于 Lance 的向量检索深度解析
数据库·数据仓库·数据分析·湖仓一体·apache doris·lakehouse·多模湖仓
这个DBA有点耶1 小时前
从INDEX到JOIN_ORDER:MySQL 8.0 Hint语法体系与五类实战场景
数据库·mysql·架构
数字新视界1 小时前
机房动环监控助力智能管理
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
梅菲塔亚1 小时前
博客_Redis入门到实战
数据库·redis·缓存
abcyuu1 小时前
用友 U8 Cloud 生产制造模块深度解析:从 BOM 建立到成本核算的技术实现
前端·数据库·制造
夜雪一千1 小时前
MySQL 的ID用什么数据类型更好?主键ID选型实战
数据库·mysql
蓝胖的四次元口袋1 小时前
Redis 知识梳理(3)
数据库·redis·缓存
一铭111992 小时前
海豹办公 1.9.15 跨端办公软件实践 文档兼容 Access 数据库与移动 WebView 排错
android·数据库·electron·开源软件·access