解决使用Feign时报错 java.lang.IllegalArgumentException: Body parameter 2 was null

本文详细记录了一次使用Feign结合Hystrix进行微服务调用时遇到的问题,即请求参数无法正确传递导致的异常。通过调整参数注解,从@RequestBody改为@RequestParam,成功解决了参数传递失败的问题。

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

 

1、报错信息

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.netflix.hystrix.exception.HystrixRuntimeException: WebArticleService#page(int,int,TbPostsPost) failed and no fallback available.
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982) ~[spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866) ~[spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
	......
Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: WebArticleService#page(int,int,TbPostsPost) failed and no fallback available.
	at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:819) ~[hystrix-core-1.5.12.jar:1.5.12]
	at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:804) ~[hystrix-core-1.5.12.jar:1.5.12]
	at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onError(OperatorOnErrorResumeNextViaFunction.java:140) ~[rxjava-1.3.8.jar:1.3.8]
	at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87) ~[rxjava-1.3.8.jar:1.3.8]
	at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87) ~[rxjava-1.3.8.jar:1.3.8]
	at com.netflix.hystrix.AbstractCommand$DeprecatedOnFallbackHookApplication$1.onError(AbstractCommand.java:1472) ~[hystrix-core-1.5.12.jar:1.5.12]
	at com.netflix.hystrix.AbstractCommand$FallbackHookApplication$1.onError(AbstractCommand.java:1397) ~[hystrix-core-1.5.12.jar:1.5.12]
	......
Caused by: java.lang.IllegalArgumentException: Body parameter 2 was null
	at feign.Util.checkArgument(Util.java:102) ~[feign-core-9.5.1.jar:na]
	at feign.ReflectiveFeign$BuildEncodedTemplateFromArgs.resolve(ReflectiveFeign.java:343) ~[feign-core-9.5.1.jar:na]
	at feign.ReflectiveFeign$BuildTemplateByResolvingArgs.create(ReflectiveFeign.java:213) ~[feign-core-9.5.1.jar:na]
	at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:72) ~[feign-core-9.5.1.jar:na]
	at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:108) ~[feign-hystrix-9.5.1.jar:na]
	at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302) ~[hystrix-core-1.5.12.jar:1.5.12]
	at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298) ~[hystrix-core-1.5.12.jar:1.5.12]
	at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46) ~[rxjava-1.3.8.jar:1.3.8]
	......

2、错误代码

@GetMapping(value = "v1/articles/{pageNum}/{pageSize}")
    String page(@PathVariable(value = "pageNum") int pageNum,
                @PathVariable(value = "pageSize") int pageSize,
                @RequestBody(required = false) TbPostsPost tbPostsPost);

通过调试发现此时,路径参数pageNum,pageSize无法获取到值,从而发生报错,将代码改为:

 @GetMapping(value = "v1/articles/{pageNum}/{pageSize}")
    String page(@PathVariable(value = "pageNum",required = false) int pageNum,
                @PathVariable(value = "pageSize",required = false) int pageSize,
                @RequestBody(required = false) TbPostsPost tbPostsPost);

发现问题还是没有解决。

3、正确代码

 最后发现将@RequestBody改为@RequestParam,问题最终解决。

    @GetMapping(value = "v1/articles/{pageNum}/{pageSize}")
    String page(@PathVariable(value = "pageNum") int pageNum,
                @PathVariable(value = "pageSize") int pageSize,
                @RequestParam(required = false) TbPostsPost tbPostsPost);

 

<think>好的,用户遇到了Java中的IllegalArgumentException异常,特别是与Fallback factory相关的错误。我需要先理解这个异常通常出现在什么情况下,以及Fallback factory的作用。 首先,IllegalArgumentException通常表示方法接收到了不合法或不适当的参数。在Fallback factory的上下文中,可能是在使用熔断框架如Hystrix或Spring Cloud Circuit Breaker出现的。Fallback factory用于创建fallback实例,当主方法调用失败提供备用逻辑。 根据引用[3],提到了Spring中的Advice、Advisor和Advised概念,这可能与AOP相关,但用户的问题更偏向于熔断机制。不过,我需要确保Fallback factory的正确实现,比如是否实现了正确的接口,或者是否有正确的方法签名。 常见原因可能包括: 1. Fallback factory未实现特定接口,比如Hystrix的FallbackFactory。 2. Fallback方法参数不匹配,比如缺少Throwable参数。 3. 依赖注入问题,比如Fallback类未被Spring管理。 4. 泛型类型不匹配,Fallback factory的泛型参数与实际服务接口不一致。 解决方案需要检查这些方面。例如,确保Fallback factory类正确实现了接口,并正确覆盖了create方法,同参数和泛型类型正确。此外,检查是否有正确的注解,比如@Component,确保Spring能扫描到该类。 用户可能需要检查他们的Fallback factory是否遵循了框架的要求,比如在Spring Cloud中,Fallback factory需要实现FallbackFactory<T>,其中T是Feign客户端接口。同,Fallback方法需要接收异常参数,以便处理具体的错误原因。 另外,引用[2]提到了@AfterReturning注解,虽然与AOP相关,但这里的Fallback可能涉及类似的回调机制,需要确保回调方法的正确实现。例如,是否在Fallback方法中正确处理了异常,或者是否正确覆盖了需要的方法。 最后,可能需要用户提供代码片段以便更具体地诊断,但基于现有信息,给出常见原因和解决方案是可行的。</think>针对Java中与Fallback Factory相关的$IllegalArgumentException$异常,以下是分步解决方案: ### 一、常见错误原因 1. **未实现$FallbackFactory$接口** ```java //错误示例:未指定泛型类型 public class PaymentFallbackFactory implements FallbackFactory { //... } ``` 需明确定义泛型类型参数: ```java public class PaymentFallbackFactory implements FallbackFactory<PaymentService> { @Override public PaymentService create(Throwable cause) { return new PaymentServiceFallback(cause); } } ``` 2. **依赖注入失效**(未添加@Component注解)[^3] ```java // 缺少组件注解将导致Spring无法注入 public class UserFallbackFactory implements FallbackFactory<UserService> { //... } ``` 3. **参数签名不匹配** ```java // 错误示例:缺少Throwable参数 public class OrderServiceFallback implements OrderService { public OrderServiceFallback() { // 缺少异常参数 } } ``` ### 二、完整解决方案 1. **基础实现模板** ```java @Component public class ProductServiceFallbackFactory implements FallbackFactory<ProductService> { @Override public ProductService create(Throwable cause) { return new ProductService() { @Override public Product getProduct(Long id) { log.error("Fallback triggered", cause); return new Product(0L, "Fallback Product"); } }; } } ``` 2. **Feign客户端配置** ```java @FeignClient( name = "product-service", fallbackFactory = ProductServiceFallbackFactory.class ) public interface ProductService { @GetMapping("/products/{id}") Product getProduct(@PathVariable Long id); } ``` 3. **启用熔断配置** ```yaml feign: circuitbreaker: enabled: true ``` ### 三、调试技巧 1. 检查Fallback类是否被Spring管理(使用@Component) 2. 验证泛型类型是否与Feign接口一致 3. 确保包含异常传播: $$ \text{Fallback逻辑} \rightarrow \text{异常捕获} \rightarrow \text{日志记录} $$ 4. 使用调试模式查看依赖关系: ```properties logging.level.org.springframework.cloud.openfeign=DEBUG ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值