Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava Spring Boot microservice AsyncReturnValueHandler提供404无可用消息错误_Java_Spring_Spring Mvc_Spring Boot_Rx Java - Fatal编程技术网

RxJava Spring Boot microservice AsyncReturnValueHandler提供404无可用消息错误

RxJava 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

我已经使用RxJava编写了一个Spring Boot微服务,您可以在这里找到。一切都很好。现在,我正在我的控制器/资源类中将RxJava
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
注释您的方法。这解决了问题。谢谢。事实上,我欠你这个答复。我贴了两个问题来完成这件事。