今天在学习springcloud的hystrix的熔断机制时遇到报错:com.netflix.hystrix.contrib.javanica.exception.FallbackDefinitionException: fallback method wasn’t found: hystrixGet([class java.lang.Long])] with root cause
经过核查已经解决!
原代码:
package com.springcloud.controller;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.springcloud.pojo.Dept;
import com.springcloud.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author panglili
* @create 2022-07-31-13:49
*/
@RestController
public class DeptController {
@Autowired(required = true)
private DeptService deptService;
//熔断机制,此方法调用失败后去调用定义的备选方法
@HystrixCommand(fallbackMethod = "hystrixGet")
@GetMapping("/dept/get/{id}")
public Dept queryById(@PathVariable("id") Long id){
Dept dept = deptService.queryById(id);
if(dept==null){
throw new RuntimeException("id====>"+id+"不存在信息无法找到");
}
return dept;
}
//上面的方法蹦了之后执行的备选方法
public Dept hystrixGet(@PathVariable("id") long id){
return new Dept()
.setDeptno(id)
.setDb_name("id===>"+id+"没有对应信息")
.setDb_source("no this database in mysql");
}
}
仔细看上图的代码,hystrix熔断机制要求处理的备选方案参数必须和原来一致,由于我的粗心,将备选参数类型写成了小写long所以报错,更改后已经正常,和我一样错误的记得检查参数类型是否一致。