feign传递数组_springcloud feign传输List的坑

本文介绍了在使用Feign进行服务调用时遇到的无法直接传递List类型参数的问题,包括尝试使用@RequestParam和@RequestBody注解的错误方法,以及导致的500错误。最后,提供了一个正确的解决方案,即使用@RequestParam注解配合String[]类型来解决数组传递问题。

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

无法直接传输List

错误方法1:

@RequestMapping(value = "/stat/merchant/get_merchant_compare_info", method =RequestMethod.POST)

@ResponseBody

MerchantCompareTotalInfo getMerchantCompareInfo(

@RequestParam(value= "licenseNoList")

List licenseNoList);

错误: feign.FeignException: status 500 reading MerchantStatRemoteApi#getMerchantCompareInfo(List); content

错误方法2:

@RequestMapping(value = "/stat/merchant/get_merchant_compare_info", method =RequestMethod.POST)

@ResponseBody

MerchantCompareTotalInfo getMerchantCompareInfo(@RequestBody List licenseNoList);

错误: feign.FeignException: status 500 reading MerchantStatRemoteApi#getMerchantCompareInfo(List); content

错误方法3:

@RequestMapping(value = "/stat/merchant/get_merchant_compare_info", method =RequestMethod.POST)

@ResponseBody

MerchantCompareTotalInfo getMerchantCompareInfo(@RequestBody String[] licenseNoList);

服务端的数组是null

正确方法:

@RequestMapping(value = "/stat/merchant/get_merchant_compare_info", method =RequestMethod.POST)

@ResponseBody

MerchantCompareTotalInfo getMerchantCompareInfo(@RequestParam("licenseNoList") String[] licenseNoList);

### Spring Feign 使用指南与常见问题解决 #### 1. 启用Hystrix断路器 在Spring Cloud项目中,可以通过启用Hystrix来增强Feign客户端的容错能力。这通常通过在主类上添加`@EnableHystrix`或`@EnableCircuitBreaker`注解实现[^1]。例如: ```java @SpringBootApplication @EnableCircuitBreaker // 或 @EnableHystrix public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` #### 2. 指定Feign接口中的字符集 为了确保Feign客户端能够正确处理请求体的编码问题,可以在接口方法的注解中指定`consumes`属性。例如,当需要发送UTF-8编码的JSON数据时,可以这样定义接口[^2]: ```java @PostMapping(value = "/portal/core/appdata/install", consumes = "application/json;charset=UTF-8") void install(@RequestBody String data); ``` #### 3. 解决JSON数组参数类型不匹配问题 如果请求体是一个JSON数组(如`[{}, {}]`),而接口定义的参数类型为`String`,则会引发类型不匹配错误。此时,应将参数类型更改为`Object[]`或`List<Object>`以适配JSON数组格式[^3]。修改后的代码如下: ```java @PostMapping(value = "/portal/core/appdata/install", consumes = "application/json;charset=UTF-8") void install(@RequestBody Object[] data); ``` 或者使用`List<Object>`: ```java @PostMapping(value = "/portal/core/appdata/install", consumes = "application/json;charset=UTF-8") void install(@RequestBody List<Object> data); ``` #### 4. 防止“too many Body parameters”问题 当Feign客户端接口中存在多个`@RequestBody`注解时,可能会触发“too many Body parameters”的异常。这是因为HTTP协议只允许一个请求体。因此,在设计Feign接口时,应确保每个方法最多只有一个`@RequestBody`注解。 #### 5. Feign的安全配置与防护 在微服务架构中,Feign的安全性至关重要。除了基本的传输层安全(如TLS/SSL)外,还需要考虑认证授权、防重放攻击等高级安全机制[^4]。以下是一些常见的安全配置示例: - **设置超时时间**:通过配置`feign.client.config.default.connect-timeout`和`feign.client.config.default.read-timeout`来限制请求的超时时间。 - **启用日志记录**:通过配置`logging.level.<package>=DEBUG`来调试Feign请求和响应。 - **集成OAuth2**:在Feign客户端中添加Token传递逻辑,确保每次请求都携带有效的认证信息。 #### 示例代码:Feign客户端配置 ```java @Configuration public class FeignConfig { @Bean public Logger.Level feignLoggerLevel() { return Logger.Level.FULL; // 记录完整的请求和响应日志 } } @FeignClient(name = "example-service", configuration = FeignConfig.class) public interface ExampleClient { @PostMapping(value = "/api/resource", consumes = "application/json") ResponseEntity<String> createResource(@RequestBody Map<String, Object> body); } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值