不论是Thrift RPC还是SpringWeb服务,服务方法的输入和输出参数都要通过网络在Server/Client之间传输。实现数据对象传输,发送端需要对数据对象进行序列化(JSON或二进制数据流),接收端需要对收到的数据反序列化还原为原始的数据对象。
从3.32.0版本开始,sql2java增加了静态字段过滤功能,是指在生成sql2java的数据库表记录对象类时,允许指定字段的可见度(ColumnVisibility)。
sql2java的完整使用示例参见码云仓库: sql2java-example: sql2java调用示例 (gitee.com)
可见度是指字段对数据接收端是否可见,只要控制数据库表对象在序列化/反序列化时忽略不可见字段,数据接收端最终收到数据库对象中就不会包含该字段。
具体实现就是sql2java-generator会根据字段的可见度要求,对于不可见字段,在生成对应字段代码时增加Jackson,Fastjson,Thrift注解(Annotation)指定在表对象序列化/反序列化时忽略该字段。
字段可见度定义
sql2java中字段可见度定义对应枚举类型gu.sql2java.ColumnVisibility
枚举变量 | JSON是否可见 | Thrift是否可见 | 说明 |
---|---|---|---|
DEFAULT | true | true | 默认:全可见 |
LOCAL | false | false | 仅本地可见,与远端(Spring WEB,Thrift RPC)交互时不可见 |
THRIFT | false | true | Thrift RPC 传输时可见,Thrft RPC 客户端与服务端交互时可见 |
JSON | true | false | JSON序列化时可见,Spring WEB 客户端与服务端 交互时可见(Spring WEB是基于jackson实现序列化和反序列化的),使用fastjson对数据库对象进行序列化和反序列化时同样有效。 |
定义可见度
字段注释标记 SCOPE@@EPOSC
用于定义字段可见度,具体格式为
SCOPE@(LOCAL|JSON|THRIFT)@EPOSC
标记中的LOCAL,JSON,THRIFT
对应着上述的三种可见度
如下示例,下面的表定义中,private_time
字段定义了SCOPE@@EPOSC
注释标记,指定了该字段仅本地可见。也就是说只有服务端本身可以读写该字段。
CREATE TABLE IF NOT EXISTS dc_device (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'X@NAME:设备id@X',
`name` varchar(32) DEFAULT NULL COMMENT 'X@NAME:设备名称@X,用户指定',
`physical_address` varchar(32) NOT NULL UNIQUE COMMENT '设备X@NAME:物理地址@X,MAC地址,IMEI或其他设备识别码',
`private_time` bigint DEFAULT 0 COMMENT 'SCOPE@LOCAL@EPOSC设备令牌创建的时间戳(毫秒)',
`os_arch` varchar(64) DEFAULT NULL COMMENT 'X@NAME:操作系统平台@X,操作系统名称及版本及硬件架构名称,例如:Windows-x86_64,Linux-x86_64,Android-arm...'
) COMMENT 'X@NAME:前端设备记录@X,前端设备基本信息' DEFAULT CHARSET=utf8;
sql2java-generator生成的DeviceBean
对象中dc_device.private_time
字段的对应成员privateTime
定义代码如下:
/** comments:设备令牌创建的时间戳(毫秒) */
@ApiModelProperty(value = "设备令牌创建的时间戳(毫秒)" ,dataType="Long")
@CodegenDefaultvalue("0")@CodegenInvalidValue("-1")
@ExcelColumn(sort=9)
@com.alibaba.fastjson.annotation.JSONField(serialize = false,deserialize = false)
@com.fasterxml.jackson.annotation.JsonIgnore
private Long privateTime;
/**
* Getter method for {@link #privateTime}.<br>
* Meta Data Information (in progress):
* <ul>
* <li>full name: dc_device.private_time</li>
* <li>comments: 设备令牌创建的时间戳(毫秒)</li>
* <li>default value: '0'</li>
* <li>column size: 19</li>
* <li>JDBC type returned by the driver: Types.BIGINT</li>
* </ul>
*
* @return the value of privateTime
*/
@JsonIgnore
public Long getPrivateTime(){
return privateTime;
}
可以看到,privateTime
成员定义的Jackson注解@JsonIgnore
和fastjson注解@JSONField
指定该字段在JSON序列化和反序列化时忽略应该字段。同时privateTime
的getter方法上也没有thrift字段注解@ThriftField
,代表应该字段没有被定义为Thrift Struct成员字段。
swift2thrift-maven-plugin插件生成的IDL中就不会有privateTime
字段:
struct DeviceBean {
1: required bool _new;
2: required i32 modified;
3: required i32 initialized;
4: optional i32 id;
5: optional string name;
6: optional string physicalAddress;
7: optional string osArch;
}
完整说明
参见 sql2java: 轻量级数据库(SQL)访问代码(java)生成器 (gitee.com) README.md的《静态字段过滤》章节