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/redkalestart
# 关闭redkale进程
./bin/redkaleshutdown
# 重启redkale进程
./bin/redkalerestart
# 生成openapi文档
./bin/redkaleapidoc
以上是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";
}
}