从 Entity 生成各层代码用户文档

BizWorks Toolkit 仅支持生成领域驱动设计(Domain-Driven Design,简称DDD)四层架构代码,暂不支持生成对应于模型-视图-控制器(Model-View-Controller,简称MVC)三层架构的代码。您可以参考本文从本地实体类快速生成各层代码。

步骤一:创建配置文件

说明
  • 配置文件并非必需。如果未提供配置文件,系统将采用默认值进行生成。如果默认值无法满足需求,请您创建新的配置文件。

  • 配置文件的路径为:.bizworks/genConfig.yaml。在每次代码生成之前,系统会首先读取最新的配置内容。

  • 配置文件的位置和名称应保持一致,以确保系统能够正确读取和应用配置。

在项目根目录的 .bizworks文件夹右击,选择new > BizWorks 配置文件 > Entity代码生成配置image

系统将会生成一份名为genConfig.yaml的配置文件,代码示例如下:

bizworks:
  generation:
#    # 注释掉的配置为默认值, 如果需要自定义, 请按需删除行最前方的注释 '#" 符号
#    # 全局配置
#    global:
#      #	指定输出目录; 默认值: ${vcsRoot}
#      # ${vcsRoot} 为可以找到的第一个 git 项目根目录; 项目根目录.例:${vcsRoot}/模块名/src/main/java
#      baseDir: "${vcsRoot}"
#      #	作者名	默认值: bizworks:
#      author: "bizworks: ${userName}"
#      # 默认源码合并策略(src 下)
#      defaultMergeStrategy: merge
    appTemplate:
#      # 模板名称, 目前只支持 DDD.
#      name: DDD
      projectMetadata:
        basePackage: "com.demo.sample"
      scaffoldMetadata:
#        # 结构对象: DTO
#        structuralObject:
#          # 源码目录
#          sourceDir: "${baseDir}/${boundedContextCode}/${boundedContextCode}-client/src/main/java"
#          # 结构对象包名,可以通过拼接的方式注入 basedPackage 和限界上下文编码,甚至是聚合跟等编码
#          package: "${basePackage}.${boundedContextCode}.client.api.dto"
#          # 是否生成, 默认为 true
#          # 注意,generate 为 false 虽然实际不会生成,但是脚手架认为存在该部分内容来处理,即其他项仍可能包含该依赖;其他配置仍然有效
#          generate: true
#          # 合并策略
#          mergeStrategy: "${defaultMergeStrategy}"
#          # 在需要的情况下,从 Entity 生成的 name
#          nameFromEntity: "${entityName}DTO"
#        # 结构对象: pageInfo DTO
#        pageInfo:
#          sourceDir: "${baseDir}/${boundedContextCode}/${boundedContextCode}-client/src/main/java"
#          package: "${basePackage}.${boundedContextCode}.client.api.dto"
#          generate: true
#          mergeStrategy: "${defaultMergeStrategy}"
#          nameFromEntity: "${entityName}PageInfo"
#        # 接口定义,(Controller 超类)
#        clientInterface:
#          sourceDir: "${baseDir}/${boundedContextCode}/${boundedContextCode}-client/src/main/java"
#          package: "${basePackage}.${boundedContextCode}.client.api"
#          generate: true
#          mergeStrategy: "${defaultMergeStrategy}"
#          nameFromEntity: "${entityName}ServiceI"
#        controller:
#          sourceDir: "${baseDir}/${boundedContextCode}/${boundedContextCode}-entry/src/main/java"
#          package: "${basePackage}.${boundedContextCode}.entry.service"
#          generate: true
#          mergeStrategy: "${defaultMergeStrategy}"
#          nameFromEntity: "${entityName}ServiceController"
#        applicationService:
#          sourceDir: "${baseDir}/${boundedContextCode}/${boundedContextCode}-app/src/main/java"
#          package: "${basePackage}.${boundedContextCode}.app.api"
#          generate: true
#          mergeStrategy: "${defaultMergeStrategy}"
#          nameFromEntity: "${entityName}Service"
#        applicationServiceImpl:
#          sourceDir: "${baseDir}/${boundedContextCode}/${boundedContextCode}-app/src/main/java"
#          package: "${basePackage}.${boundedContextCode}.app.service"
#          generate: true
#          mergeStrategy: "${defaultMergeStrategy}"
#          nameFromEntity: "${entityName}ServiceImpl"
#        structuralObjectConverter:
#          sourceDir: "${baseDir}/${boundedContextCode}/${boundedContextCode}-app/src/main/java"
#          package: "${basePackage}.${boundedContextCode}.app.converter"
#          generate: true
#          mergeStrategy: "${defaultMergeStrategy}"
#          nameFromEntity: "${entityName}DtoConverter"
#        entity:
#          sourceDir: "${baseDir}/${boundedContextCode}/${boundedContextCode}-domain/src/main/java"
#          package: "${basePackage}.${boundedContextCode}.domain.model"
#          generate: true
#          mergeStrategy: "${defaultMergeStrategy}"
#        valueObject:
#          sourceDir: "${baseDir}/${boundedContextCode}/${boundedContextCode}-domain/src/main/java"
#          package: "${basePackage}.${boundedContextCode}.domain.model"
#          generate: true
#          mergeStrategy: "${defaultMergeStrategy}"
#        domainService:
#          sourceDir: "${baseDir}/${boundedContextCode}/${boundedContextCode}-domain/src/main/java"
#          package: "${basePackage}.${boundedContextCode}.domain.service"
#          generate: true
#          mergeStrategy: "${defaultMergeStrategy}"
#          nameFromEntity: "${entityName}Service"
#        repository:
#          sourceDir: "${baseDir}/${boundedContextCode}/${boundedContextCode}-domain/src/main/java"
#          package: "${basePackage}.${boundedContextCode}.domain.repository"
#          generate: true
#          mergeStrategy: "${defaultMergeStrategy}"
#          nameFromEntity: "${entityName}Repository"
#        repositoryImpl:
#          sourceDir: "${baseDir}/${boundedContextCode}/${boundedContextCode}-infrastructure/src/main/java"
#          package: "${basePackage}.${boundedContextCode}.infrastructure.repository"
#          generate: true
#          mergeStrategy: "${defaultMergeStrategy}"
#          nameFromEntity: "${entityName}RepositoryImpl"
#        dataObject:
#          sourceDir: "${baseDir}/${boundedContextCode}/${boundedContextCode}-infrastructure/src/main/java"
#          package: "${basePackage}.${boundedContextCode}.infrastructure.tunnel.dataobject"
#          generate: true
#          mergeStrategy: "${defaultMergeStrategy}"
#          nameFromEntity: "${entityName}DO"
#        dataObjectConverter:
#          sourceDir: "${baseDir}/${boundedContextCode}/${boundedContextCode}-infrastructure/src/main/java"
#          package: "${basePackage}.${boundedContextCode}.infrastructure.converter"
#          generate: true
#          mergeStrategy: "${defaultMergeStrategy}"
#          nameFromEntity: "${entityName}DoConverter"
#        dao:
#          sourceDir: "${baseDir}/${boundedContextCode}/${boundedContextCode}-infrastructure/src/main/java"
#          package: "${basePackage}.${boundedContextCode}.infrastructure.tunnel.database"
#          generate: true
#          mergeStrategy: "${defaultMergeStrategy}"
#          nameFromEntity: "${entityName}Mapper"
  • 配置文件中的注释部分为默认配置,即在配置文件缺失或未配置相关项的情况下,将使用该项的默认值。如需进行修改,请去掉行首的注释符号 #,并注意保持缩进格式。

  • 名为 basePackage 的配置项在配置文件生成时,其值为 Toolkit 自动推测的值,请根据实际情况进行验证并进行相应更改。

内置变量

  • 配置文件的 global 块内部可使用以下变量:

    • vcsRoot: 表示当前 Project 可以找到的第一个 Git 项目根目录或项目根目录。

    • userName: 表示当前登录的 BizWorks 平台用户名。

  • 配置文件的 scaffoldMetadata块内部可使用的变量,在global块的基础上新增以下变量:

    • baseDir: global中配置的 baseDir值。

    • defaultMergeStrategyglobal中配置的 defaultMergeStrategy值。

    • boundedContextCode: 限界上下文编码。

    • basePackageprojectMetadata中配置的basePackage值。

    • entityName: 对应的 Entity 类的名称。

步骤二:生成代码

说明
  • 在生成代码前,请确保项目已在 IDE 中正确打开,并能够通过该环境成功编译。

  • 生成的代码内容为包含了基础增删改查功能的模板,仅供参考,以提高效率。生成内容会随着 BWAF 框架的迭代而变化,因此需根据具体项目情况进行进一步的调整和修改,请勿直接将其当作生产可用的代码发布。

在标记了 DomainObjectValueObject的类上右键单击后,选择BizWorks > 从 Entity 生成各层代码

image

以下几点虽然不影响代码生成,但会对编译和运行产生影响:

  • 实体/值对象类须标记Data注解(或 Getter、Setter),否则生成的 Converter 类将无法正确拷贝和转换属性值。

  • 实体应包含名为id的字段,建议使用 Long类型。否则,需在代码生成后自行修改相关代码以串接流程。