SpringQueryMap在项目中的应用

本文介绍了如何通过引入SpringQueryMap改进项目中get请求的参数管理,实现更清晰的API设计,减少方法名复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

这样整个方法就很清晰了

### Spring Cloud Alibaba 集成教程与使用指南 Spring Cloud Alibaba 是阿里巴巴基于 Spring Cloud 提供的一套微服务解决方案,旨在帮助开发者更方便地构建分布式应用系统。以下是关于如何集成 Spring Cloud 和阿里云的相关技术内容以及具体实践。 #### 1. 技术环境准备 为了顺利搭建和运行 Spring Cloud Alibaba 的项目,需满足以下依赖条件: - JDK 版本:JDK 1.8+ - Maven 版本:Maven 3.6+ - Spring Boot 版本:2.2.4.RELEASE - Spring Cloud 版本:Hoxton.SR1 - Spring Cloud Alibaba 版本:2.2.0.RELEASE 这些版本组合是由官方推荐的最佳适配配置[^1]。 #### 2. 添加依赖项 在项目的 `pom.xml` 文件中引入 Spring Cloud Alibaba 的 BOM(Bill of Materials),以便管理所有相关组件的版本一致性: ```xml <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- Nacos Discovery --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- Sentinel 流量控制 --> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> </dependency> <!-- Feign 客户端支持 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies> ``` 以上代码片段展示了如何通过 Maven 构建工具来添加必要的依赖项[^2]。 #### 3. 配置文件设置 在 `application.yml` 中完成基础配置,例如连接 Nacos 注册中心和服务发现功能: ```yaml server: port: 8080 spring: application: name: demo-service cloud: nacos: discovery: server-addr: localhost:8848 # 设置Nacos服务器地址 feign: client: config: default: connect-timeout: 5000 read-timeout: 5000 ``` 此部分配置用于初始化服务注册与发现机制,并调整远程调用超时时间[^2]。 #### 4. 使用 @SpringQueryMap 实现复杂查询 当需要传递多个参数至远程接口时,可利用 `@SpringQueryMap` 注解简化操作过程。下面是一个示例展示如何定义一个 Feign 接口以处理带有多参数请求的情况: ```java package com.example.demo.client; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.cloud.openfeign.SpringQueryMap; @FeignClient(name = "example-client", url = "http://localhost:8081") public interface ExampleClient { @GetMapping("/query") String queryData(@SpringQueryMap Map<String, Object> params); } ``` 上述代码说明了如何借助 `@SpringQueryMap` 将复杂的对象映射为 HTTP 查询字符串参数[^3]。 #### 5. 常见问题排查 如果遇到启动失败或者无法正常访问外部服务等问题,请检查以下几个方面: - 是否正确安装并启用了 Nacos Server; - 应用程序名称是否唯一且未与其他实例冲突; - 网络连通性测试,确认本地机器能够成功解析目标主机名; --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MonkeyKing.sun

对你有帮助的话,可以打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值