DaaS 服务端 Java二次开发指南-Lesson 6:使用定制序列化

563 阅读3分钟

回到目录

Lesson 6:使用定制序列化

daas中还提供了另外一套序列化方案,用于简单的控制序列化。

注意:此方案还在验证中,请谨慎使用

一个例子

还是以TransactionCustomManagerImpl为例,增加以下方法:

public Object useSerializeScope(BankUserContext ctx) throws Exception {
    ChangeRequest r1 = changeRequestManagerOf(ctx)
        .createChangeRequest(ctx, "name", ChangeRequestType.DEPOSITE, "P000001");
    ChangeRequest r2 = changeRequestDaoOf(ctx)
        .load(r1.getId(), ChangeRequestTokens.withoutLists());
    
    SerializeScope serializeScope = SerializeScope.INCLUDE()
        .field(ChangeRequest.ID_PROPERTY).as("序号")
        .field(ChangeRequest.NAME_PROPERTY)
        .field(ChangeRequest.CREATE_TIME_PROPERTY)
        .field(ChangeRequest.REQUEST_TYPE_PROPERTY, SerializeScope.INCLUDE()
            .field(ChangeRequestType.CODE_PROPERTY)
            .field(ChangeRequestType.NAME_PROPERTY)
        );
    Map<String, Object> serializeResult = BaseViewPage.serialize(r2, serializeScope);
    return CollectionUtils.toList(r2, serializeResult);
}

运行 ‘gradle runBoot’, 使用postMan调用 ‘http://localhost:8080/bank/transactionManager/useSerializeScope/’ 得到结果如图:

第一部分是默认的序列化结果。 第二部分是用SerializeScope控制了序列化范围的结果。

这个就是控制序列化范围的代码,理解起来很简单。 上例还展示了一个 ‘as’方法,用来给输出的字段改名。 可以看到输出结果中已经改名了。

基本支持

默认的,daas会为每个实体都生成4种SerializeScope的实现。生成的代码路径为:
xxx_core_src/<项目包路径>/XxxBaseViewScope.java

例如 com/demo/bank/BankBaseViewScope.java

还会添加一个空实现来继承,并允许在项目中定制,代码路径为:

xxx_custom_src/<项目包路径>/XxxViewScope.java

以ChangeRequest 为例,会生成:

  • public static SerializeScope getChangeRequestSummaryScope()
  • public static SerializeScope getChangeRequestDetailScope()
  • public static SerializeScope getChangeRequestListItemScope()
  • public static SerializeScope getChangeRequestSecondaryListItemScope()

这四种序列化范围对应四种常用的展示场景。

你可以在XxxViewScope中,基于已经生成的代码再做修改。例如下面是一个项目中的截图:

常用的方法

// 新建一个‘序列化范围’对象,指明之后的 field 才包含在输出中,反之不包含
public static SerializeScope INCLUDE()
// 新建一个‘序列化范围’对象,指明之后的 field 不包含在输出中,反之包含
public static SerializeScope EXCLUDE()
// 指定一个字段简单字段。
public SerializeScope field(String fieldName)
// 指定一个对象字段,同时指定该对象成员的序列化范围
public SerializeScope field(String fieldName, SerializeScope node)
// 为当前字段指定一个别名.
public SerializeScope as(String alias)
// 指定当前字段仅在不为空的情况下才输出
public SerializeScope not_empty()
// 指定当前字段为空时,自动输出一个空list
public SerializeScope forceList()
// 指定当前字段为空是,自动输出一个空对象
public SerializeScope forceObject()
// 当前字段类型为SmartList类型时,指定不输出辅助信息
public SerializeScope noListMeta()
// 当前字段为List类型时,指定输出的字段中只包含ID列表,真正的内容放在 ‘dataContainer’这个特定对象内
public SerializeScope in_data_container()
// 指定当前字段输出时,数值翻转,字符串倒转。 用于某些特定场景。
public SerializeScope revers()
// 指定当前复杂字段的所有字段,都使用一个相同的序列化范围。 常用于对key不可枚举的map需要定制化的场景
public SerializeScope any_field_of(String fieldName, SerializeScope node)
// 指定当前字段输出时,提升一个层级。仅用于BaseEntity和Map类型的字段。
public SerializeScope move_up()

常用的定制方法

// 移除一个字段
public SerializeScope remove_field(String propertyName)
// 找到一个字段,将其定位为当前字段
public SerializeScope for_field(String propertyName)

恭喜你!!

恭喜你,您已经可以使用daas-start-kit完成日常的开发工作了。

回到目录