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的《静态字段过滤》章节

相关推荐
千里码aicood2 分钟前
【2025】springboot教学评价管理系统(源码+文档+调试+答疑)
java·spring boot·后端·教学管理系统
彭于晏68910 分钟前
Android广播
android·java·开发语言
程序员-珍28 分钟前
使用openapi生成前端请求文件报错 ‘Token “Integer“ does not exist.‘
java·前端·spring boot·后端·restful·个人开发
2401_857297911 小时前
招联金融2025校招内推
java·前端·算法·金融·求职招聘
福大大架构师每日一题1 小时前
23.1 k8s监控中标签relabel的应用和原理
java·容器·kubernetes
金灰1 小时前
HTML5--裸体回顾
java·开发语言·前端·javascript·html·html5
菜鸟一皓1 小时前
IDEA的lombok插件不生效了?!!
java·ide·intellij-idea
爱上语文1 小时前
Java LeetCode每日一题
java·开发语言·leetcode
bug菌2 小时前
Java GUI编程进阶:多线程与并发处理的实战指南
java·后端·java ee
程序猿小D2 小时前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa