Redkale 2.7.0 发布。
Redkale, 一个Java分布式微服务框架,1.6M的jar可以代替传统几十M的第三方。包含TCP/UDP、HTTP、RPC、依赖注入、序列化与反序列化、数据库操作、WebSocket等功能。 一方面模块高度整合,极大的简化业务开发代码,一方面暴露大量底层,方便二次框架开发。
Java并不臃肿, 臃肿的是你自己的设计思维!
本次版本更新内容:
1、【新增】增加ConvertCoder功能,可以自定义字段的序列化
2、【新增】增加JsonMultiDecoder、JsonMultiObjectDecoder、OneOrList功能
3、【新增】JsonConvert全面兼容JSON5
4、【新增】增加redkale命令行
5、【新增】增加HttpRpcAuthenticator功能
6、【新增】MessageAgent增加配置MessageCoder功能
7、【新增】实现LoggingSearchHandler功能
8、【新增】ConvertFactory增加mapFieldFunc、ignoreMapColumns功能
9、【新增】增加PropertiesAgent功能
10、【新增】增加链路ID Traces
11、【新增】增加ResourceListener.different功能
12、【新增】增加Environment类
13、【新增】增加RestLocale功能
14、【优化】优化PrepareServlet中HttpRender的初始化顺序
15、【优化】日志支持java.util.logging.ConsoleHandler.denyreg配置
16、【优化】FilterColumn支持least=0时空字符串也参与过滤
17、【优化】HttpRequest兼容参数名为空字符串
18、【优化】移除CryptColumn、CryptHandler功能
19、【优化】PrepareServlet 更名为 DispatcherServlet
20、【优化】@WebServlet合并url
21、【修复】修复HttpResponse.finish结果status=404时按200输出的bug
22、【修复】修复HttpMessageLocalClient创建request时没有赋值给currentUserid值
23、【修复】修复Rest.createRestServlet带特定泛型问题
24、【修复】修复Convert模块中父类含public field,subclass不传父类会导致NoSuchFieldError的bug
25、【修复】修复ApiDocCommand在没有运行时不能生成doc的bug
26、【修复】修复JsonWriter.writeWrapper按latin1编码写的bug
27、【修复】修复JsonDynEncoder在定制字段情况下会被全量字段的动态类覆盖的bug
更新详情介绍:
Json 序列化功能增强:
1、支持JSON5
{ intval1: 0xa, //支持十六进制, 值转成10 intval2: +100, //支持+开头, 值转成100 longval1: NaN, //支持NaN, 值转成0 longval2: Infinity, //值转成Long.MAX_VALUE floatval1: NaN, //支持NaN, 值转成Float.NaN doubleval: -Infinity, //值转成Double.NEGATIVE_INFINITY //这是一个单行注释 name : "haha", /* 这是一个多行注释 这是一个多行注释 */ desc : "哈哈", ints: [1,2,3,4,] //兼容对象尾部多一个',' }
以上json字符串能正确反解析成Java对象。
2、OneOrList
当一个对象字段可能是单个对象,也可能是对象集合时,可以设定字段类型为 OneOrList<T>
public class JavaBean { public String name; public OneOrList<String> address; }
{"name":"redkale", "address": "wuhan"} {"name":"redkale", "address": ["wuhan","hubei","china"]}
上面两个json字符串都可以正确解析成JavaBean对象, 也可以 直接用OneOrList的泛型来反序列化对象:
JsonConvert convert = JsonConvert.root(); Type type = new TypeToken<OneOrList<String>>() {}.getType(); OneOrList<String> one = convert.convertFrom(type, "haha"); OneOrList<String> list = convert.convertFrom(type, "['haha','hehe']"); System.out.println(convert.convertTo(type, one)); //输出: "haha" System.out.println(convert.convertTo(type, list)); //输出: ["haha","hehe"]
以太坊JSON-RPC规范接口 某些接口中的字段存在这种需求:
3、ConvertImpl
当一个对象字段类型是抽象类,反序列化时根据识别子类独有的字段转换成对应的子类, 需要使用ConvertImpl
@ConvertImpl(types = {Bean123.class, Bean23.class, Bean234.class}) publicabstract class AbstractBean { } public class Bean123 extends AbstractBean { public String a1; public String a2; public String a3; } public class Bean23 extends AbstractBean { public String a2; public String a3; } public class Bean234 extends AbstractBean { public String a2; public String a3; public String a4; } JsonConvert convert = JsonConvert.root(); String json1 = "{'a1':'111', 'a2':'222', 'a3':'333'}"; AbstractBean bean1 = convert.convertFrom(AbstractBean.class, json1); System.out.println(bean1); //Bean123对象 String json2 = "{'a2':'222', 'a4':'444', 'a3':'333'}"; AbstractBean bean2 = convert.convertFrom(AbstractBean.class, json2); System.out.println(bean2); //Bean234对象 String json3 = "{'a3':'333'}"; AbstractBean bean3 = convert.convertFrom(AbstractBean.class, json3); System.out.println(bean3); //Bean23对象, 无子类独有的字段,优先匹配特定字段数最少的子类 String json4 = "{'a1':'111', 'a2':'222', 'a3':'333', 'a4':'444'}"; AbstractBean bean4 = convert.convertFrom(AbstractBean.class, json4); System.out.println(bean4); //Bean123对象, a1字段在前面,优先匹配Bean123类
以太坊JSON-RPC规范接口 某些接口同样存在这种需求。
4、JsonMultiDecoder
当一个数组的元素是不同的数据类型时,反序列化时需要使用JsonMultiDecoder(通过JsonConvert调用)
JsonConvert convert = JsonConvert.root(); String json = "['aaaa', ['hehe','haha']]"; Type[] types = new Type[]{String.class, String[].class}; Object[] objs = convert.convertFrom(types, json); System.out.println(objs[0]); //String对象 "aaaa" System.out.println(objs[1]); //String数组 ["hehe","haha"]
注意: json数组元素的个数必须与Type数组的长度一致。 JSON-RPC 的批量操作接口存在这种需求。
redkale命令行:
bin下新增了redkale脚本, 通过脚本命令行可以更方便的操作:
# 启动redkale进程,无参数 ./bin/redkale # 启动redkale进程 ./bin/redkale start # 关闭redkale进程 ./bin/redkale shutdown # 重启redkale进程 ./bin/redkale restart # 生成openapi文档 ./bin/redkale apidoc
以上是redkale内置的命令,开发者可以通过@Command 自定义命令:
public class CommandTestService implements Service { @Command("say") //只接收say命令 public String say(String cmd, String[] params) { System.out.println("say接收命令: " + cmd + ", 参数: " + Arrays.toString(params)); return "say done"; } @Command("hi") //只接收hi命令 public String hi(String cmd, String[] params) { System.out.println("hi接收命令: " + cmd + ", 参数: " + Arrays.toString(params)); return "hi done"; } @Command //会接收到所有命令 public String all(String cmd, String[] params) { System.out.println("all接收命令: " + cmd + ", 参数: " + Arrays.toString(params)); return "all done"; } }
还没有评论,来说两句吧...