项目应用中遇到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在项目中的应用_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()
}

这样整个方法就很清晰了