RxJava Spring Boot microservice AsyncReturnValueHandler提供404无可用消息错误
我已经使用RxJava编写了一个Spring Boot微服务,您可以在这里找到。一切都很好。现在,我正在我的控制器/资源类中将RxJavaRxJava Spring Boot microservice AsyncReturnValueHandler提供404无可用消息错误,java,spring,spring-mvc,spring-boot,rx-java,Java,Spring,Spring Mvc,Spring Boot,Rx Java,我已经使用RxJava编写了一个Spring Boot微服务,您可以在这里找到。一切都很好。现在,我正在我的控制器/资源类中将RxJavaObservables转换为DeferredResult。我听说这可以使用HandlerMethodReturnValueHandler和Observable到DeferredResult的简单适配器来实现。我开始实施这个。首先,我编写了一个像这样的HandlerMethodReturnValueHandler package com.example.hand
Observable
s转换为DeferredResult
。我听说这可以使用HandlerMethodReturnValueHandler
和Observable
到DeferredResult
的简单适配器来实现。我开始实施这个。首先,我编写了一个像这样的HandlerMethodReturnValueHandler
package com.example.handlers;
public class ObservableReturnValueHandler implements AsyncHandlerMethodReturnValueHandler {
@Override
public boolean isAsyncReturnValue(Object returnValue, MethodParameter returnType) {
return returnValue != null && supportsReturnType(returnType);
}
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return Observable.class.isAssignableFrom(returnType.getParameterType());
}
@Override
public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest) throws Exception {
if (returnValue == null) {
mavContainer.setRequestHandled(true);
return;
}
final Observable<?> observable = Observable.class.cast(returnValue);
WebAsyncUtils.getAsyncManager(webRequest)
.startDeferredResultProcessing(new ObservableAdapter<>(observable), mavContainer);
}
public class ObservableAdapter<T> extends DeferredResult<T> {
public ObservableAdapter(Observable<T> observable) {
observable.subscribe(this::setResult, this::setErrorResult);
}
}
}
package com.example;
@Controller
@RequestMapping("/api/currencyconverter")
public class CurrencyResource {
private static final Logger log = LoggerFactory.getLogger(CurrencyConverter.class);
@Autowired
private CurrencyConverterService currencyConverterService;
@RequestMapping(value = "/rates", method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_UTF8_VALUE })
public Observable<CurrencyRatesDTO> getCurrencyRates(
@RequestParam("symbol") Set<String> currencyRates) {
log.debug("Retrieving currency rates.");
return currencyConverterService.getCurrencyRates(currencyRates);
}
}
现在,我的资源/控制器类如下所示
package com.example.handlers;
public class ObservableReturnValueHandler implements AsyncHandlerMethodReturnValueHandler {
@Override
public boolean isAsyncReturnValue(Object returnValue, MethodParameter returnType) {
return returnValue != null && supportsReturnType(returnType);
}
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return Observable.class.isAssignableFrom(returnType.getParameterType());
}
@Override
public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest) throws Exception {
if (returnValue == null) {
mavContainer.setRequestHandled(true);
return;
}
final Observable<?> observable = Observable.class.cast(returnValue);
WebAsyncUtils.getAsyncManager(webRequest)
.startDeferredResultProcessing(new ObservableAdapter<>(observable), mavContainer);
}
public class ObservableAdapter<T> extends DeferredResult<T> {
public ObservableAdapter(Observable<T> observable) {
observable.subscribe(this::setResult, this::setErrorResult);
}
}
}
package com.example;
@Controller
@RequestMapping("/api/currencyconverter")
public class CurrencyResource {
private static final Logger log = LoggerFactory.getLogger(CurrencyConverter.class);
@Autowired
private CurrencyConverterService currencyConverterService;
@RequestMapping(value = "/rates", method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_UTF8_VALUE })
public Observable<CurrencyRatesDTO> getCurrencyRates(
@RequestParam("symbol") Set<String> currencyRates) {
log.debug("Retrieving currency rates.");
return currencyConverterService.getCurrencyRates(currencyRates);
}
}
问题是,当我发送GET请求时,我收到以下有线错误。控制台中也没有任何错误消息或异常跟踪
{
"timestamp": 1485742987017,
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/api/currencyconverter/rates"
}
然后我调试了代码,发现调用了控制器方法,从控制器成功调用了REST端点。订阅了可观察的,结果被接收并在observeReturnValueHandler
内成功设置为DeferredResult
。之后发生的事情将导致此错误
您可以在找到当前代码。项目附带的自述文件中给出了启动和运行项目所需的所有步骤。我在这里错过了什么。非常感谢您的帮助。
@ComponentScan(basePackages = { "com.example.*" })
应该是
@ComponentScan(basePackages = { "com.example" })
404故障是因为组件扫描未拾取控制器。
@ComponentScan(basePackages = { "com.example.*" })
应该是
@ComponentScan(basePackages = { "com.example" })
404是因为组件扫描没有拾取您的控制器。谢谢您的回复。但这不是真正的问题。请求到达控制器后,成功调用REST端点。然后异步接收响应并设置延迟结果。一切都进展顺利。后来发生的事情导致了这个错误。我更新了答案,强调了这一点。谢谢你的回复。但这不是真正的问题。请求到达控制器后,成功调用REST端点。然后异步接收响应并设置延迟结果。一切都进展顺利。后来发生的事情导致了这个错误。我更新了答案,强调了这一点。您应该使用
@RestController
或使用@ResponseBody
注释您的方法。这解决了问题。谢谢。事实上,我欠你这个答复。我发布了两个问题来完成这件事。您应该使用@RestController
或使用@ResponseBody
注释您的方法。这解决了问题。谢谢。事实上,我欠你这个答复。我贴了两个问题来完成这件事。