求你了,不要再在对外接口中使用枚举类型了!
java.lang.IllegalArgumentException:
No enum constant com.a.b.f.m.a.c.AType.P_M
大概就是以上的内容,看起来还是很简单的,提示的错误信息就是在AType这个枚举类中没有找到P_M这个枚举项。
问题重现
一方库指的是本项目中的依赖
二方库指的是公司内部其他项目提供的依赖
三方库指的是其他组织、公司等来自第三方的依赖
public interface AFacadeService {
public AResponse doSth(ARequest aRequest);
}
public Class AResponse{
private Boolean success;
private AType aType;
}
public enum AType{
P_T,
A_B
}
然后B系统依赖了这个二方库,并且会通过RPC远程调用的方式调用AFacadeService的doSth方法。
public class BService {
@Autowired
AFacadeService aFacadeService;
public void doSth(){
ARequest aRequest = new ARequest();
AResponse aResponse = aFacadeService.doSth(aRequest);
AType aType = aResponse.getAType();
}
}
public enum AType{
P_T,
A_B,
P_M
}
public enum AType{
P_T,
A_B
}
这种情况下,在B系统通过RPC调用A系统的时候,如果A系统返回的AResponse中的aType的类型为新增的P_M时候,B系统就会无法解析。一般在这种时候,RPC框架就会发生反序列化异常。导致程序被中断。
原理分析
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) {
T result = enumType.enumConstantDirectory().get(name);
if (result != null)
return result;
if (name == null)
throw new NullPointerException("Name is null");
throw new IllegalArgumentException(
"No enum constant " + enumType.getCanonicalName() + "." + name);
}
扩展思考
1、枚举严格控制下游系统的传入内容,避免非法字符。 2、方便下游系统知道都可以传哪些值,不容易出错。
1、如果二方库升级,并且删除了一个枚举中的部分枚举项,那么入参中使用枚举也会出现问题,调用方将无法识别该枚举项。 2、有的时候,上下游系统有多个,如C系统通过B系统间接调用A系统,A系统的参数是由C系统传过来的,B系统只是做了一个参数的转换与组装。这种情况下,一旦A系统的二方库升级,那么B和C都要同时升级,任何一个不升级都将无法兼容。
public Class AResponse{
private Boolean success;
/**
* @see AType
*/
private String aType;
}
历时六年,“Java工程师成神之路”系列终于出版了它的第一本纸质书《深入理解Java核心技术:写给Java工程师的干货笔记(基础篇)》纸质书版本重写了“基础篇”其中80%的内容。整体结构上比开源的版本更加合理,内容也比开源的版本更加丰富。书中介绍了普通Java工程师必须要学习的相关知识点,包括面向对象和Java语言基础两大部分,涵盖基本数据类型、关键字、异常、I/O流、集合、反射、泛型和枚举......另外书中还附有一个“卧槽”彩蛋,让你直呼神奇。
以下几类人群不适合读这本书:
1、完全没有编程经验的人;这本书不是cook book,不能帮你21天掌握Java,并没有从安装虚拟机、配置classpath讲起。
2、认为代码写出来能跑就行,抵制一切"八股"的人;这本书中很多的知识点都是来源于工作中遇到的"坑"、书中分析了很多源码,是一本深入原理的书籍。一本十足的"八股"宝典。
其他人,无论是刚工作一两年的新手,还是工作了五六年的老司机;无论是准备找工作需要一本面试宝典,还是需要一本书来帮你躲避工作中的那些坑;无论是体系化学习作为知识体系,还是日常学习作为查缺补漏。
这本书,都适合你。
附赠“成神”思维导图
最后给大家申请了专享6折的优惠,但是是限时限量的,所以,欲购从速喽。扫描下方二维码或者点击阅读原文链接,就可以直达优惠链接了。
长按扫码立享优惠
618大促福利不要错过哦!
ATF8PV(当当20元优惠码)
当当每满100-50 再叠加20元优惠码
实付100可用 花80元买原价200元的书
使用时间:5.25-6.3
数量有限,先买就是赚到!
(更多好书可扫码查看)
▼点击阅读原文,优惠购买此书~