求你了,不要再在对外接口中使用枚举类型了!

本文通过一个线上异常案例,分析了在对外接口中使用枚举类型可能导致的问题。当二方库升级,新增枚举项时,未升级的系统会因反序列化失败引发异常。文中讨论了RPC框架的反序列化原理,引用《阿里巴巴Java开发手册》的约定,并提出使用字符串代替枚举以避免兼容性问题。此外,还探讨了枚举作为参数和返回值的优缺点,建议在接口设计中谨慎使用枚举。
摘要由CSDN通过智能技术生成

最近,我们的线上环境出现了一个问题,线上代码在执行过程中抛出了一个IllegalArgumentException,分析堆栈后,发现最根本的的异常是以下内容:

java.lang.IllegalArgumentException: 

No enum constant com.a.b.f.m.a.c.AType.P_M

大概就是以上的内容,看起来还是很简单的,提示的错误信息就是在AType这个枚举类中没有找到P_M这个枚举项。

于是经过排查,我们发现,在线上开始有这个异常之前,该应用依赖的一个下游系统有发布,而发布过程中是一个API包发生了变化,主要变化内容是在一个RPC接口的Response返回值类中的一个枚举参数AType中增加了P_M这个枚举项。

但是下游系统发布时,并未通知到我们负责的这个系统进行升级,所以就报错了。

我们来分析下为什么会发生这样的情况。

问题重现

首先,下游系统A提供了一个二方库的某一个接口的返回值中有一个参数类型是枚举类型。

一方库指的是本项目中的依赖

二方库指的是公司内部其他项目提供的依赖

三方库指的是其他组织、公司等来自第三方的依赖

public interface AFacadeService {

    public AResponse doSth(ARequest aRequest);

}

public Class AResponse{

    private Boolean success;

    private AType aType;

}

public enum AType{

    P_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倾听铃的声

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值