一、问题背景:
作为一个java后端工程师的开发,除了维护自己软件系统提供的rest接口、mq消息队列、redis频道等等这些功能之外,少不了与其他后台系统或数据中台的数据交互。交互的过程不管是请求体或者返回体,如果都是使用通用的map,那代码的通用性和维护性将会变得很差,而且也不符合java的“高内聚低耦合”的设计思路。除了那种接口调用获取的参数非常少的特例,这种情况下专门搞得对象就比较多余,大部分曾经都是非常适用的。
二、使用对比:
使用通用的参数map和统一的String做请求体和返回体时:(返回体往往还需要利用第三方jsonObject工具进行转变,这就有点不够酷了)
public void post(String aUrl) {
String url = baseUrl + aUrl;
Map<String, Object> param = new HashMap<>();
param.put("attr1", "value");
param.put("attr2", true);
ResponseEntity<String> forEntity = restTemplate.postForEntity(url, param, String.class);
System.out.println(forEntity.getBody());
}
适用具体的请求体和返回体对象来承载时:
public void post1(String aUrl) {
String url = baseUrl + aUrl;
ARequest aRequest = new ARequest();
aRequest.setAttr1("value");
aRequest.setAttr2(true);
BResppnse bResppnse= new BResppnse();
ResponseEntity<bResppnse> forEntity = restTemplate.postForEntity(url, aResq, bResppnse.class);
}
三、快速生成对应JavaBean对象
3.1 在postman进行接口调用获取对应的json数据体,使用在线工具快速生成对应的代码
在线生成工具地址
一般我会把setter和getter函数删掉,使用lombok的注解让代码更加简洁
3.2 格式处理
如果你的json体名字是非常标准的按照小驼峰命名,那恭喜你你生成的命名格式都是符合规范的,不过遇到有些系统命名就是那种小写下划线就比较麻烦了,难道要手动改吗?字段少还好,多的话这也太慢了而且容易出错,这里我写一段py代码直接让你的代码生产效率一下子翻个好几倍
先看一下效果吧:
自动生成的代码如下:
private String a_string;
private String b_string;
private boolean a_boolean;
py代码处理之后如下,解决了命名问题、还有类属性跟json字段耦合的问题:
@JsonAlias("a_string")
private String aString;
@JsonAlias("b_string")
private String bString;
@JsonAlias("a_boolean")
private boolean aBoolean;
由于我用得使用springboot自动集成的json格式化工具com.fasterxml.jackson,所以我这里格式化重命名的注释使用的是@JsonAlias,大家可以根据自己的项目使用情况进行简单更改
直接上一波代码,拿走不谢:
import re
def name_convert_to_camel(name: str) -> str:
"""下划线转驼峰(小驼峰)"""
return re.sub(r'(_[a-z])', lambda x: x.group(1)[1].upper(), name)
def get_attr_value(line):
"""提取出属性名"""
pattern = '.* (?P<attr>\w+)'
mo = re.match(pattern, line)
if mo:
return mo.group('attr') if mo.group('attr') else None
if __name__ == '__main__':
in_file_name = 'in.java'
out_file_name = 'out.java'
try:
with open(in_file_name, 'r', encoding='utf-8') as r:
lines = r.readlines()
with open(out_file_name, 'w', encoding='utf-8') as w:
for line in lines:
attr = get_attr_value(line)
w.writelines(f' @JsonAlias("{attr}")' + '\n')
new_attr_name = name_convert_to_camel(attr)
new_line = line.replace(attr, new_attr_name)
w.writelines(new_line + '\n')
except FileNotFoundError as e:
print(e)
如果想看代码运行的目录结构可以戳github代码链接:https://github.com/junkaitongxue/DreamKiteToolkit/tree/master/src/python/dreamkite/toolkit/module/tools
(以上为DreamKite本人原创,转载请附上原文链接)