天天看点

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()
  }