在一次feign调用中,有一个需求,根据订单编号查询订单,接口如下:
@FeignClient(name = "order", path = "/")
public interface OrderFeignService {@GetMapping(value = "/order/{orderNumber}")BizOrderModel checkBizOrderExist(@PathVariable("orderNumber") String orderNumber);
}
实现如下:
@RestController
@RequestMapping("/")
public class OrderController implements OrderFeignService { @Override@GetMapping(value = "/order/{orderNumber}")public BizOrderModel checkBizOrderExist(@PathVariable("orderNumber") String orderNumber) {return orderService.findByOrderNumber(orderNumber);}
}
调用如下:
@Service
@Slf4j
public class OrderService {@AutowiredOrderFeignService orderFeignService;public void test(){if (null == orderFeignService.checkBizOrderExist(dto.getOrderNumber())) {LOG.ERROR("订单信息不存在");}
}
异常信息如下:
feign.FeignException: status 404 reading XXXXClient#XXXXMethod(Long)
at feign.FeignException.errorStatus(FeignException.java:62)
at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:91)
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:138)
at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:76)
at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:103)
at com.sun.proxy.$Proxy97.querySpuDetailBySpuId(Unknown Source)
at XXXX(IndexService.java:41)
at XXXX(ElasticsearchTest.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at
...
异常排查:
即当get请求的入参为null时,如本例中的orderNumber没有传参,feign调用时会报404!