HystrixCommand 注释导致 ControllerLinkBuilder 中断
HystrixCommand annotation causing ControllerLinkBuilder to break
我正在尝试使用 spring-hateoas
将 HATEOAS 应用到我的 spring 启动应用程序。这工作正常,直到我将我的 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());
}
我的汇编程序 class 将 Data 对象包装到 Resource 对象中现在抛出此错误:Could not find current request via RequestContextHolder
如果我注释掉 HystrixCommand
注释,错误就会消失,一切正常。
我的汇编程序 class 只是实现了 Springs 的 ResourceAssembler<T, D>
接口并覆盖了 toResource
方法。
有什么办法可以解决这个问题吗?
我不确定我是否可以将此视为答案,它更像是一种解决方法:
@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
中)放在另一个方法中。
它以这种方式工作,但绝对不是一种干净的方式。所以如果有人知道如何以更好的方式解决这个问题..
我正在尝试使用 spring-hateoas
将 HATEOAS 应用到我的 spring 启动应用程序。这工作正常,直到我将我的 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());
}
我的汇编程序 class 将 Data 对象包装到 Resource 对象中现在抛出此错误:Could not find current request via RequestContextHolder
如果我注释掉 HystrixCommand
注释,错误就会消失,一切正常。
我的汇编程序 class 只是实现了 Springs 的 ResourceAssembler<T, D>
接口并覆盖了 toResource
方法。
有什么办法可以解决这个问题吗?
我不确定我是否可以将此视为答案,它更像是一种解决方法:
@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
中)放在另一个方法中。
它以这种方式工作,但绝对不是一种干净的方式。所以如果有人知道如何以更好的方式解决这个问题..