网站首页 > 精选教程 正文
请点击【关注】获取更多互联网和技术干货,头条号IT徐胖子原创本文请勿转载,感谢支持
1 文章概述
在阿里巴巴开发手册中有这样一条强制规定值得大家关注:【强制】二方库里可以定义枚举类型,参数可以使用枚举类型,但是接口返回值不允许使用枚举类型或者包含枚举类型的POJO对象。
我们在日常开发中服务生产者会提供二方包给消费者引用,在返回对象中属性不能包含枚举类型,这是一个强制要求。我们通过一个实例分析:为什么阿里巴巴开发手册中会有这样一条强制要求。
2 生产者实例
服务生产者提供1.0版本二方包:
public class StudentDTO implements Serializable {
private Long id;
private String name;
private HobbyEnum hobbyEum;
}
public enum HobbyEnum {
FOOTBALL(1),
BASKETBALL(2)
}
服务生产者发布RPC服务:
public class StudentServiceImpl implements StudentService {
public StudentDTO queryStudentById(Long id) {
StudentDTO student = new StudentDTO();
student.setId(100L);
student.setName("今日头条号「IT徐胖子」");
student.setHobbyEnum(HobbyEnum.FOOTBALL);
return student;
}
}
3 消费者实例
服务消费者引入生产者1.0版本二方包:
<dependency>
<groupId>com.test.xpz</groupId>
<artifactId>xpz-student-api</artifactId>
<version>1.0</version>
</dependency>
服务消费者以如下代码调用可以得到正确结果,到目前为止都没有问题:
public class StudentTest {
@Resource
private StudentService studentService;
public void getStudent() {
StudentDTO student = studentService.queryStudent(100L);
System.out.println(student);
}
}
4 发现问题
服务生产者枚举类新增信息并且升级二方包至2.0版本:
public enum HobbyEnum {
FOOTBALL(1),
BASKETBALL(2),
SWIMMING(3)
}
服务生产者修改提供服务代码实现:
public class StudentServiceImpl implements StudentService {
public StudentDTO queryStudentById(Long id) {
StudentDTO student = new StudentDTO();
student.setId(100L);
student.setName("今日头条号「IT徐胖子」");
student.setHobbyEnum(HobbyEnum.SWIMMING);
return student;
}
}
服务消费者不做任何改动保持引用1.0版本二方包。现在生产者返回结果包含SWIMMING信息,但是1.0版本二方包根本没有这个值,所以会引起序列化异常。这是一个非常严重的问题,消费者在没有做任何改动的情况下依然出现异常。
hessian.io.HessianFieldException:
Caused by: java.lang.IllegalArgumentException: No enum constant com.xpz.student.HobbyEnum.SWIMMING
5 解决方案
StudentDTO属性全部改为基本类型或者基本类型包装类就可以避免这类严重错误,消费者可以使用HobbyEnum枚举类去翻译hobby这个数值的含义。这个问题非常容易被忽略值得大家关注。
public class StudentDTO implements Serializable {
private Long id;
private String name;
private int hobby;
}
请点击【关注】获取更多互联网和技术干货,头条号IT徐胖子原创本文请勿转载,感谢支持
猜你喜欢
- 2025-01-10 如何使用JavaScript遍历对象?
- 2025-01-10 面试官:来,讲一下枚举类型在开发时中实际应用场景!
- 2025-01-10 SpringBoot中Jackson实现自定义序列化和反序列化控制5种方式总结
- 2025-01-10 Delphi基础教程图文版之数据类型(枚举)
- 2025-01-10 EnumMap&EnumSet的用法
- 2025-01-10 枚举虽好,但务必记得避坑
- 2025-01-10 Python学习 -- 枚举类
- 2025-01-10 你知道 Java 中关键字 enum 是一个语法糖吗?反编译枚举类
- 2025-01-10 深入剖析枚举:从简单概念到高级应用
- 2025-01-10 Java 枚举与策略模式、函数式接口的结合:实现高内聚低耦合的设计
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)