項目應用中遇到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 注解

使用方法:
@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()
}