日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

命令行工具,VO和命令行之間的轉化工具

作者:魯尼的小寶貝 更新時間: 2022-03-15 編程語言
項目地址
cli: 命令行工具https://gitee.com/lyw2010/cli

#### 介紹

命令行工具

把命令行轉化為vo

把vo轉化為命令行


## 把命令行轉化為VO
使用的場景是需要用過命令行發(fā)送到應用的時候,需要自己去解析發(fā)送過來的參數(shù),這樣耗時而且容易出錯,特別是在參數(shù)很多的時候,是一個棘手的問題

比如發(fā)送的命令

java -jar  xxxx.jar  --sourceDataType  "mysql" --sql  " select *from ttt where id=2222" --sourceIp  "127.0.0.1" --sourcePort  "3306" --sourceSchema  zgdc_warehouse_source --sourcePasswd  123456 --sourceUserName  root --targetDataType  mysql --targetIp  127.0.0.1 --targetPort   "3306" --targetPasswd  123456 --targetSchema  zgdc_warehouse_app --targetUserName  root --targetTable  xy_money_rate --holdTimeout  null --where  null --columns  company_name,rate --columnsName  公司名稱,占比 --dataType  String,Double
public class IndicatorCalculateVO {
    @Cli(
        longOpt = "sourceDataType",
        name = "數(shù)據(jù)庫類型",
        required = true,
        desc = "數(shù)據(jù)庫類型"
    )
    private String sourceDataType;
    @Cli(
        longOpt = "sql",
        name = "需要執(zhí)行的sql",
        required = true,
        desc = "需要執(zhí)行的sql"
    )
    private String sql;
    @Cli(
        longOpt = "sourceIp",
        name = "數(shù)據(jù)源的url",
        required = true,
        desc = "數(shù)據(jù)源的url"
    )
    private String sourceIp;
    @Cli(
        longOpt = "sourcePort",
        name = "數(shù)據(jù)源的端口",
        required = true,
        desc = "數(shù)據(jù)源的端口"
    )
    private Integer sourcePort;
    @Cli(
        longOpt = "sourceSchema",
        name = "數(shù)據(jù)庫",
        required = true,
        desc = "數(shù)據(jù)庫"
    )
    private String sourceSchema;
    @Cli(
        longOpt = "sourcePasswd",
        name = "數(shù)據(jù)源的密碼",
        required = true,
        desc = "數(shù)據(jù)源的密碼"
    )
    private String sourcePasswd;
    @Cli(
        longOpt = "sourceUserName",
        name = "數(shù)據(jù)源的用戶信息",
        required = true,
        desc = "數(shù)據(jù)源的用戶信息"
    )
    private String sourceUserName;
    @Cli(
        longOpt = "targetDataType",
        name = "目標數(shù)據(jù)庫的類型",
        required = true,
        desc = "目標數(shù)據(jù)庫的類型"
    )
    private String targetDataType;
    @Cli(
        longOpt = "targetIp",
        name = "目標數(shù)據(jù)源的url",
        required = true,
        desc = "目標數(shù)據(jù)源的url"
    )
    private String targetIp;
    @Cli(
        longOpt = "targetPort",
        name = "數(shù)據(jù)源的端口",
        required = true,
        desc = "數(shù)據(jù)源的端口"
    )
    private Integer targetPort;
    @Cli(
        longOpt = "targetPasswd",
        name = "目標數(shù)據(jù)源的密碼",
        required = true,
        desc = "目標數(shù)據(jù)源的密碼"
    )
    private String targetPasswd;
    @Cli(
        longOpt = "targetSchema",
        name = "數(shù)據(jù)庫",
        required = true,
        desc = "數(shù)據(jù)庫"
    )
    private String targetSchema;
    @Cli(
        longOpt = "targetUserName",
        name = "目標數(shù)據(jù)源的用戶信息",
        required = true,
        desc = "目標數(shù)據(jù)源的用戶信息"
    )
    private String targetUserName;
    @Cli(
        longOpt = "targetTable",
        name = "目標數(shù)據(jù)表",
        required = true,
        desc = "目標數(shù)據(jù)表"
    )
    private String targetTable;
    @Cli(
        longOpt = "holdTimeout",
        name = "holdTimeout",
        desc = "數(shù)據(jù)保留是時長 單位是小時"
    )
    private Integer holdTimeout;
    @Cli(
        longOpt = "where",
        name = "where",
        desc = "where 查詢條件"
    )
    private String where;
    @Cli(
        longOpt = "columns",
        name = "表的列",
        desc = "表的列"
    )
    private String columns;
    @Cli(
        longOpt = "columnsName",
        name = "表的列名字 多個使用逗號分隔 和columns長度一致",
        desc = "表的列名字 多個使用逗號分隔 和columns長度一致"
    )
    private String columnsName;
    @Cli(
        longOpt = "dataType",
        name = "數(shù)據(jù)類型 多個使用逗號分隔 和columns長度一致",
        desc = "數(shù)據(jù)類型 多個使用逗號分隔 和columns長度一致"
    )
    private String dataType;
}
``````

這樣轉化的時候,需要挨個的去選擇,去識別,順序需要嚴格的控制。

有了這個工具之后,只需要在接收參數(shù)地方進行一次轉化就可以了

``````
object IndicatorCalculateApp {
  private[this] val logger: Logger = LoggerFactory.getLogger(classOf[IndicatorCalculateApp])

  def main(args: Array[String]): Unit = {


    logger.info(s"請求參數(shù)是:")
    val vo = CliUtils.parseObject(args, classOf[IndicatorCalculateVO])
    println(vo)
   }
}
``````

這樣的參數(shù)在轉化VO



這樣分分鐘就可以實現(xiàn)


## 把VO轉化為 命令行
 在使用的時候,需要通過 命令行的方式,把使用的參數(shù)傳給應用,操作比較麻煩
 
 比如需要把上面的IndicatorCalculateVO 通過命令行發(fā)給應用,么有專門的工具,需要自己挨個的使用
 
 使用工具之后

CliUtils.getCommandLine(vo, IndicatorCalculateVO.class);
具體的實現(xiàn)

 
/**
     * 獲取命令行
     *
     * @param entry 實體
     * @param <T>   需要轉化的vo
     * @return 命令行
     */
    private static <T> String getCommandLineWithException(T entry) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
        Class<T> clazz = (Class<T>) entry.getClass();
        return getCommandLine(entry, clazz);
    }
這樣,參數(shù)和vo的相互轉化使用統(tǒng)一的工具進行轉化,減少出錯,只是關系功能就可以了,不需要挨個的去對每一個參數(shù)的情況,減少工作量

原文鏈接:https://blog.csdn.net/poem_2010/article/details/120520805

欄目分類
最近更新