天天看點

SpringQueryMap在項目中的應用

項目應用中遇到get請求傳遞參數的問題:

1、傳遞多個參數。

2、傳遞的參數可以為空,為空則不傳遞出去。

剛開始的項目比較單一,直接寫的請求方法,比如:

@FeignClient("cmdb", url = "\${fastone.global.cmdb.host}")
interface CmdbClient {

  @GetMapping("/cmdb/v1/product")
  fun findByFastoneStrategyAndProductLevelAndPayTypeAndFastoneRegion(
    @RequestParam fastoneStrategy: String,
    @RequestParam productLevel: String,
    @RequestParam payType: String,
    @RequestParam fastoneRegion: String,
  ): Response<List<CmdbProduct>>

  /**
   * 帶Context查詢CmdbProduct資訊
   * context contains:fastoneStrategy,productLevel,payType,fastoneRegion
   */
  @GetMapping("/cmdb/v1/product")
  fun findByFastoneStrategyAndProductLevelAndPayTypeAndFastoneRegionAndFastoneModel(
    @RequestParam fastoneStrategy: String,
    @RequestParam productLevel: String,
    @RequestParam payType: String,
    @RequestParam fastoneRegion: String,
    @RequestParam fastoneModel: String
  ): Response<List<CmdbProduct>>


  @GetMapping("/cmdb/v1/product")
  fun findByFastoneStrategyAndProductLevelAndPayTypeAndFastoneRegionAndSystemPlatformAndProductTypeAndVendorModel(
    @RequestParam fastoneStrategy: String,
    @RequestParam productLevel: String,
    @RequestParam payType: String,
    @RequestParam fastoneRegion: String,
    @RequestParam systemPlatform: String,
    @RequestParam productType: String,
    @RequestParam vendorModel: String,
  ): Response<List<CmdbProduct>>

}      

上面的寫法會造成檢視方法和調用方法的地方都很難受,想檢視或者調用方法都需要仔細檢視名字

有沒有什麼方法能滿足上面的需求,經同僚推薦使用@SpringQueryMap 注解

SpringQueryMap在項目中的應用

使用方法:

@FeignClient("cmdb", url = "\${fastone.global.cmdb.host}")
interface CmdbClient {

  @GetMapping("/cmdb/v1/product")
  fun getCmdbProducts(@SpringQueryMap condition: CmdbQueryCondition): Response<List<CmdbProduct>>
}      
data class CmdbQueryCondition(
  val skuId: String? = null,
  val fastoneStrategy: String? = null,
  val productLevel: String? = null,
  val fastoneRegion: String? = null,
  val vendor: String? = null,
  val productType: ProductType? = null,
  val systemPlatform: SystemPlatform? = null,
  val fastoneModel: String? = null,
  val fastoneFamily: String? = null,
  val vendorModel: String? = null,
  val payType: String? = null,
)      
/**
   * 擷取IMAGE,STORAGE,STORAGE_EFS,TRAFFIC,FASTSTOR_ESSENTIAL等非VM的報價
   */
  fun findByFastoneRegionAndFastoneModel(fastoneRegion: String, fastoneModel: String): CmdbProduct? {
    return cmdbClient.getCmdbProducts(
      CmdbQueryCondition(
        fastoneStrategy = fastoneStrategy,
        productLevel = productLevel,
        payType = PayType.ONDEMAND.name,
        fastoneRegion = fastoneRegion,
        fastoneModel = fastoneModel
      )
    ).data.firstOrNull()
  }