Hystrix的问题 使用DefaultProperties 报 Incompatible return types

(一) 问题描述
使用DefaultProperties注解配置一个默认的降级方法时
Hystrix的问题 使用DefaultProperties 报 Incompatible return types_第1张图片
出现了以上错误

2018-11-27 15:16:41.529 ERROR 4476 --- [nio-8090-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.netflix.hystrix.contrib.javanica.exception.FallbackDefinitionException: Incompatible return types. 

具体代码如下

@RestController
@DefaultProperties(defaultFallback = "defaultFallback")
public class DefaultPropertyTestController {
    @Autowired
    private RestTemplate restTemplate;
    @HystrixCommand
    @GetMapping("getUserInfo")
    @ResponseBody
    public Result getUserInfo(){
        try {
            Thread.sleep(3000);
        }catch (Exception e){
            e.printStackTrace();
        }
        User user = new User("yd");
        Result respons = new Result<>(0,"成功",user);
        return respons;
    }

    @HystrixCommand
    @GetMapping("getProductInfo")
    @ResponseBody
    public Result getProductInfo(){
        try {
            Thread.sleep(3000);
        }catch (Exception e){
            e.printStackTrace();
        }
        Product product = new Product("pen");
        Result respons = new Result<>(0,"成功",product);
        return respons;
    }

    private Result defaultFallback(){
        return new Result<>(-1,"失败",null);
    }
}

Hystrix的问题 使用DefaultProperties 报 Incompatible return types_第2张图片
当调用查询用户信息时可以成功降级
但是当调用查询产品信息时会报500错误
这是由于默认返回结果与获取产品信息的返回结果不一致导致的

这边主要是由于使用泛型的返回结果会使得实际返回的结果不固定,而导致无法使用默认的降级方法

临时想到的解决方案一是
建立一个公共的类A,让类B,类C都继承A,然后都返回Result
这样能临时解决问题

解决方案一
User.java

public class User  extends  AbstractResult{
    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public User(String username) {
        this.username = username;
    }
}

Product.java

public class Product extends AbstractResult{
    private String ProductName;

    public String getProductName() {
        return ProductName;
    }

    public void setProductName(String productName) {
        ProductName = productName;
    }

    public Product(String productName) {
        ProductName = productName;
    }
}

AbstractResult.java

public class AbstractResult {
}

DefaultPropertyTestController.java

@RestController
@DefaultProperties(defaultFallback = "defaultFallback")
public class DefaultPropertyTestController {
    @Autowired
    private RestTemplate restTemplate;
    @HystrixCommand
    @GetMapping("getUserInfo")
    @ResponseBody
    public Result getUserInfo(){
        try {
            Thread.sleep(3000);
        }catch (Exception e){
            e.printStackTrace();
        }
        User user = new User("yd");
        Result respons = new Result<>(0,"成功",user);
        return respons;
    }

    @HystrixCommand
    @GetMapping("getProductInfo")
    @ResponseBody
    public Result getProductInfo(){
       /* try {
            Thread.sleep(3000);
        }catch (Exception e){
            e.printStackTrace();
        }*/
        Product product = new Product("pen");
        Result respons = new Result<>(0,"成功",product);
        return respons;
    }

    private Result defaultFallback(){
        return new Result<>(-1,"失败",null);
    }
}

运行效果
Hystrix的问题 使用DefaultProperties 报 Incompatible return types_第3张图片
Hystrix的问题 使用DefaultProperties 报 Incompatible return types_第4张图片
既能成功降级,也能成功返回。

若后续想到更好的方法会再更新上来。。。

你可能感兴趣的:(Hystrix,Spring,Cloud)