我在練習微服務的時候發現了一個很奇怪的事情。在用openFeign的時候報了一個異常,花了我半天的時間,最后問題解決了。代碼如下:
這個是被調用的控制層代碼
@RestController @Slf4j public class PaymentController { @Resource private PaymentService paymentService; @Value("${server.port}") private String serverPort; @GetMapping("/payment/hystrix/ok/{id}") public String paymentInfo_ok(@PathVariable Integer id){ String result = paymentService.paymentInfo_ok(id); log.info("*******result: "+ result); return result; } @GetMapping("/payment/hystrix/timeout/{id}") public String paymentInfo_Timeout(@PathVariable Integer id){ String result = paymentService.paymentInfo_Timeout(id); log.info("*******result: "+ result); return result; } }
下面是調用控制層的接口:
@Component @FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT") public interface PaymentHystrixService { @GetMapping("/payment/hystrix/ok/{id}") public String paymentInfo_ok(@PathVariable Integer id); @GetMapping("/payment/hystrix/timeout/{id}") public String paymentInfo_Timeout(@PathVariable Integer id); }
這時就會報一個錯誤,FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: PathVariable annotation was empty on param 0.
一般來說@PathVariable 如果是一個參數的話,是可以省略的嗎?我啟動被調用的控制層都沒問題。然后啟動調用的服務,然后報錯。
之后我一點點去看,發現可能是@PathVariable的問題。
我就奇怪了,為啥會報錯。當然如果把這個注解刪了,能啟動但是報500錯誤。
最后正確代碼提上:
@Component @FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT") public interface PaymentHystrixService { /* * 我發現了一個很奇怪的現象,就是如果@PathVariable后面沒有加參數的話,就會報錯。 * */ @GetMapping("/payment/hystrix/ok/{id}") public String paymentInfo_ok(@PathVariable("id") Integer id); @GetMapping("/payment/hystrix/timeout/{id}") public String paymentInfo_Timeout(@PathVariable("id") Integer id); }