java:sqlj2ava的静态字段保护

不论是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注释标记,指定了该字段仅本地可见。也就是说只有服务端本身可以读写该字段。

sql 复制代码
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定义代码如下:

java 复制代码
    /** 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字段:

idl 复制代码
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的《静态字段过滤》章节

相关推荐
天天扭码18 分钟前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶18 分钟前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺23 分钟前
Spring Boot框架Starter组件整理
java·spring boot·后端
小曲程序30 分钟前
vue3 封装request请求
java·前端·typescript·vue
陈王卜1 小时前
django+boostrap实现发布博客权限控制
java·前端·django
小码的头发丝、1 小时前
Spring Boot 注解
java·spring boot
java亮小白19971 小时前
Spring循环依赖如何解决的?
java·后端·spring
飞滕人生TYF1 小时前
java Queue 详解
java·队列
武子康1 小时前
大数据-230 离线数仓 - ODS层的构建 Hive处理 UDF 与 SerDe 处理 与 当前总结
java·大数据·数据仓库·hive·hadoop·sql·hdfs
武子康1 小时前
大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
java·大数据·数据仓库·hive·hadoop·mysql