Hi,我是松柏。
对于 Hutool,Java 开发应该都不陌生,非常简单易用的一个工具包,我自己在开发中像发送网络请求、字符串、集合操作也是很经常用到,今天要说的内容就跟其中的对象转 json 工具类有关。
事情是这样的,我需要对接一个三方的 API,这个 API 接收的请求参数大概是这样的:
{
"file_url": "xxx"
"file_name": "xxx"
}
那我在使用的时候,就会定义一个对应的实体类来处理,像这样:
@Data
public class RequestParam {
private String fileUrl;
private String fileName;
}
然后通过工具类把请求发出去:
public static void main(String[] args) {
String requestParam = JSONUtil.toJsonStr(new RequestParam());
String responseBody = HttpUtil.post("xxx.com", requestParam);
}
不出意外,这个请求就要失败了,因为这个 API 接收的参数命名是下划线格式,而我们的请求参数里是驼峰格式,那怎么办呢?
最简单的方法,把实体类的命名改成下划线格式不就行了。
但是这样并不符合 Java 的命名规范,不那么优雅,而且这种问题一般工具类会有相应的处理措施,于是我来到了官方文档,果然找到了相关内容:@alias 注解,那我们就来试下他的效果:
@Data
public class RequestParam {
@Alias("file_url")
private String fileUrl;
@Alias("file_name")
private String fileName;
public static void main(String[] args) {
RequestParam requestParam1 = new RequestParam();
requestParam1.setFileUrl("111");
requestParam1.setFileUrl("222");
String requestParam = JSONUtil.toJsonStr(new RequestParam());
System.out.println(requestParam);
}
}
// 输出
{"file_url":"111","file_name":"222"}
ok,这样处理之后就没问题了。
到这里应用层面的内容就结束了,我们已经知道了这种情况应该怎么做,但是为什么我们这么做就可以了呢?
其实原理非常的简单,我们一起来看下。
我在调试的时候,第一反应是点进去看一眼不就好了?然而现实很骨感,这一层一层的方法堆栈不知道得看到啥时候。
然后突然想到,我直接看看 @Alias 在哪里使用过不就完事了?说干就干,然后我打开 idea 的全局搜索(记得选中 Scope 并选择 All Places):
一眼看见只有一个源码文件中使用到了这个注解,让调试难度直接下降了 n 倍,点进去更兴奋了,因为只有一个方法用到了它,那肯定没跑了:
好嘞,在这打个断点来看一眼,运行:
果不其然,就是在这个方法通过反射拿到注解,然后通过注解的 value 属性值完成了 key 的替换。
通过这么一个简单的例子,希望能帮助大家熟悉 @alias 注解的使用,也能了解一些 debug 的技巧。
欢迎关注公众号 co松柏 获取联系方式学习交流,有帮助的话欢迎点个赞,拜拜!