【问题标题】:HystrixCommand annotation causing ControllerLinkBuilder to breakHystrixCommand 注释导致 ControllerLinkBuilder 中断
【发布时间】:2015-10-06 12:20:28
【问题描述】:

我正在尝试使用 spring-hateoasHATEOAS 应用于我的 Spring Boot 应用程序。在我将 REST 调用包含在 HystrixCommand 中之前,这一直很好:

@HystrixCommand(fallbackMethod = "myFallbackMethod")
@RequestMapping(method = RequestMethod.GET, value = "/path")
public ResponseEntity<Resources<Resource<Data>>> getAllData() {
    String url = "http://localhost:8080/someotherpath"

    ParameterizedTypeReference<Iterable<Data>> responseType = new ParameterizedTypeReference<Iterable<Data>>() {};
    ResponseEntity<Iterable<Data>> response = restTemplate.exchange(url, HttpMethod.GET, null, responseType);

    if (response.getStatusCode().is2xxSuccessful()) {
        Iterable<Data> data = response.getBody();
        Resources<Resource<Data>> resources = assembler.toResource(data);
        return new ResponseEntity<>(resources, response.getHeaders(), response.getStatusCode());
    }
    return new ResponseEntity<>(response.getHeaders(), response.getStatusCode());
}

我将 Data 对象包装到 Resource 对象中的汇编程序类现在抛出此错误:Could not find current request via RequestContextHolder

如果我将 HystrixCommand 注释注释掉,错误就会消失,一切正常。

我的汇编类只实现了 Springs 的 ResourceAssembler&lt;T, D&gt; 接口并覆盖了 toResource 方法。

有什么办法可以解决这个问题吗?

【问题讨论】:

    标签: java spring spring-mvc spring-boot spring-hateoas


    【解决方案1】:

    我不确定我是否可以将此视为答案,这更像是一种解决方法:

    @RequestMapping(method = RequestMethod.GET, value = "/path")
    public ResponseEntity<Resources<Resource<Data>>> getAllData() {
        return getAllDataImpl()
    }
    
    @HystrixCommand(fallbackMethod = "myFallbackMethod")
    public ResponseEntity<Resources<Resource<Data>>> getAllDataImpl() {
        String url = "http://localhost:8080/someotherpath"
    
        ParameterizedTypeReference<Iterable<Data>> responseType = new ParameterizedTypeReference<Iterable<Data>>() {};
        ResponseEntity<Iterable<Data>> response = restTemplate.exchange(url, HttpMethod.GET, null, responseType);
    
        if (response.getStatusCode().is2xxSuccessful()) {
            Iterable<Data> data = response.getBody();
            Resources<Resource<Data>> resources = assembler.toResource(data);
            return new ResponseEntity<>(resources, response.getHeaders(), response.getStatusCode());
        }
        return new ResponseEntity<>(response.getHeaders(), response.getStatusCode());
    }
    

    我已将实际执行 http 请求的方法的内容(并且需要包装到 HystrixCommand 中)放在另一个方法中。 它以这种方式工作,但绝对不是一种干净的方式。所以如果有人知道如何以更好的方式解决这个问题..

    【讨论】:

      猜你喜欢
      • 2017-08-06
      • 2016-05-10
      • 2014-12-19
      • 1970-01-01
      • 2019-07-26
      • 2016-05-15
      • 2015-05-01
      • 1970-01-01
      • 2018-05-06
      相关资源
      最近更新 更多