1 package de.spring.webservices.rest.controller.adapters;
3 import org.slf4j.Logger;
4 import org.slf4j.LoggerFactory;
5 import org.springframework.web.context.request.async.DeferredResult;
12 * Instead of using this class, you could create you own implementation of
13 * org.springframework.web.servlet.mvc.method.annotation.DeferredResultAdapter
14 * for Observable and Single.
16 * spring netflix is already doing this stuff for me.
19 public class RxJavaAdapter {
20 private static final Logger LOGGER = LoggerFactory.getLogger(RxJavaAdapter.class);
22 // With no value, we depend on the Tomcat/Jboss/Jetty/etc timeout value for asynchronous requests.
23 // Spring will answer after 60 secs with an empty response (by default) and HTTP 503 status (by default) when timeout.
25 // You'd rather better rely on the server values. IMHO this is something to be controlled
26 // by the server administrator no the developer.
27 // private static final long ASYNC_TIMEOUT = 60000; /* milliseconds */
29 private RxJavaAdapter() {
33 public static final <T> DeferredResult<T> deferredAdapter(Observable<T> observable) {
35 DeferredResult<T> deferredResult = new DeferredResult<>(/** ASYNC_TIMEOUT **/);
38 .subscribe(deferredResult::setResult, exception -> {
39 Throwable realException = launderException(exception);
41 LOGGER.error("error: ", realException);
43 deferredResult.setErrorResult(realException);
46 return deferredResult;
49 public static final <T> DeferredResult<T> deferredAdapter(Single<T> single) {
51 DeferredResult<T> deferredResult = new DeferredResult<>(/** ASYNC_TIMEOUT **/);
54 .subscribe(deferredResult::setResult, exception -> {
55 Throwable realException = launderException(exception);
57 LOGGER.error("error: ", realException);
59 deferredResult.setErrorResult(realException);
62 return deferredResult;
65 private static final Throwable launderException(Throwable exception) {
66 return exception.getCause() != null
67 ? exception.getCause()