使用Micronaut Serialization时AccessRefreshToken无法序列化问题
问题分析
核心矛盾在于:你的Java库引入了micronaut-serde-jackson作为序列化组件,它会默认替代Micronaut应用中的Jackson序列化机制;但io.micronaut.security.token.jwt.render.AccessRefreshToken类仅使用Jackson的@JsonProperty注解,Serde组件无法识别该注解,导致反序列化时access_token字段无法映射到accessToken属性,最终返回null。
可行解决方案
方案1:为目标类添加Serde兼容注解
修改AccessRefreshToken类,同时添加Serde的@Serdeable和@JsonPropertyName注解,让它同时兼容Jackson和Serde两种序列化机制:
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import io.micronaut.core.annotation.Introspected; import io.micronaut.serde.annotation.Serdeable; import io.micronaut.serde.annotation.JsonPropertyName; @Introspected @Serdeable public class AccessRefreshToken { @JsonProperty("access_token") @JsonPropertyName("access_token") private String accessToken; // 请补充getter/setter方法 }
方案2:在消费应用中禁用Serde组件
如果消费应用不需要Serde功能,直接在配置文件中全局禁用Serde,恢复Jackson的默认序列化:
# application.yml micronaut: serde: enabled: false
若需要保留Serde对其他类的支持,仅针对AccessRefreshToken所在包禁用Serde:
# application.yml micronaut: serde: exclude: packages: - io.micronaut.security.token.jwt.render
方案3:调整库的依赖传递性
在库的build.gradle中,修改micronaut-serde-jackson的依赖范围,避免将其传递给消费应用:
dependencies { // 其他注解处理器依赖保持不变 compileOnly("io.micronaut.serde:micronaut-serde-jackson:1.1.0") // 或者如果库运行时需要该依赖但不想传递,使用以下配置: // implementation("io.micronaut.serde:micronaut-serde-jackson:1.1.0") { // transitive = false // } }
方案4:在消费应用中排除传递的Serde依赖
在消费应用的build.gradle中,明确排除common库带来的Serde依赖:
dependencies { // 其他依赖保持不变 implementation('fete.bird:common:1.0.0') { exclude group: 'io.micronaut.serde', module: 'micronaut-serde-jackson' } }
内容的提问来源于stack exchange,提问作者San Jaisy
相关产品推荐
相关产品推荐

