diff --git a/java-spring/accounts-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/accounts/AccountController.java b/java-spring/accounts-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/accounts/AccountController.java index 764b28f..49ce442 100644 --- a/java-spring/accounts-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/accounts/AccountController.java +++ b/java-spring/accounts-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/accounts/AccountController.java @@ -10,6 +10,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.request.async.DeferredResult; + +import rx.Observable; import rx.functions.Func1; @RestController @@ -24,14 +26,14 @@ public class AccountController { } @RequestMapping(method = RequestMethod.POST) - public DeferredResult createAccount(@RequestBody CreateAccountRequest request) { - return DeferredUtils.toDeferredResult(accountService.openAccount(request.getInitialBalance()).map(new Func1, CreateAccountResponse>() { + public Observable createAccount(@RequestBody CreateAccountRequest request) { + return accountService.openAccount(request.getInitialBalance()).map(new Func1, CreateAccountResponse>() { @Override public CreateAccountResponse call(EntityWithIdAndVersion entityAndEventInfo) { return new CreateAccountResponse(entityAndEventInfo.getEntityIdentifier().getId()); } - })); + }); } } diff --git a/java-spring/accounts-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/accounts/CommandSideWebAccountsConfiguration.java b/java-spring/accounts-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/accounts/CommandSideWebAccountsConfiguration.java index e9caf42..06b56c7 100644 --- a/java-spring/accounts-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/accounts/CommandSideWebAccountsConfiguration.java +++ b/java-spring/accounts-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/accounts/CommandSideWebAccountsConfiguration.java @@ -1,13 +1,24 @@ package net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.accounts; +import java.util.List; + import net.chrisrichardson.eventstore.javaexamples.banking.backend.commandside.accounts.AccountConfiguration; +import net.chrisrichardson.eventstore.javaexamples.banking.web.util.ObservableReturnValueHandler; + import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.web.method.support.HandlerMethodReturnValueHandler; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration @Import({AccountConfiguration.class}) @ComponentScan -public class CommandSideWebAccountsConfiguration { +public class CommandSideWebAccountsConfiguration extends WebMvcConfigurerAdapter { + + @Override + public void addReturnValueHandlers(List handlers) { + handlers.add(new ObservableReturnValueHandler()); + } } diff --git a/java-spring/accounts-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/QuerySideWebConfiguration.java b/java-spring/accounts-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/QuerySideWebConfiguration.java index a55d90a..d8f5ede 100644 --- a/java-spring/accounts-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/QuerySideWebConfiguration.java +++ b/java-spring/accounts-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/QuerySideWebConfiguration.java @@ -1,12 +1,24 @@ package net.chrisrichardson.eventstore.javaexamples.banking.web.queryside; +import java.util.List; + import net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.accounts.QuerySideAccountConfiguration; +import net.chrisrichardson.eventstore.javaexamples.banking.web.util.ObservableReturnValueHandler; + import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.web.method.support.HandlerMethodReturnValueHandler; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration @Import({QuerySideAccountConfiguration.class}) @ComponentScan -public class QuerySideWebConfiguration { +public class QuerySideWebConfiguration extends WebMvcConfigurerAdapter { + + @Override + public void addReturnValueHandlers(List handlers) { + handlers.add(new ObservableReturnValueHandler()); + } + } diff --git a/java-spring/accounts-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/accounts/AccountQueryController.java b/java-spring/accounts-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/accounts/AccountQueryController.java index 2cdcbb6..7e554c6 100644 --- a/java-spring/accounts-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/accounts/AccountQueryController.java +++ b/java-spring/accounts-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/accounts/AccountQueryController.java @@ -9,6 +9,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; + +import rx.Observable; import rx.functions.Func1; import java.math.BigDecimal; @@ -24,13 +26,13 @@ public class AccountQueryController { } @RequestMapping(value="/accounts/{accountId}", method = RequestMethod.GET) - public DeferredResult get(@PathVariable String accountId) { - return DeferredUtils.toDeferredResult(accountInfoQueryService.findByAccountId(new EntityIdentifier(accountId)).map(new Func1() { + public Observable get(@PathVariable String accountId) { + return accountInfoQueryService.findByAccountId(new EntityIdentifier(accountId)).map(new Func1() { @Override public GetAccountResponse call(AccountInfo accountInfo) { return new GetAccountResponse(accountInfo.getId(), new BigDecimal(accountInfo.getBalance())); } - })); + }); } @ResponseStatus(value= HttpStatus.NOT_FOUND, reason="account not found") diff --git a/java-spring/common-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/util/ObservableReturnValueHandler.java b/java-spring/common-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/util/ObservableReturnValueHandler.java new file mode 100644 index 0000000..207b48a --- /dev/null +++ b/java-spring/common-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/util/ObservableReturnValueHandler.java @@ -0,0 +1,31 @@ +package net.chrisrichardson.eventstore.javaexamples.banking.web.util; + +import rx.Observable; + +import org.springframework.core.MethodParameter; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.context.request.async.DeferredResult; +import org.springframework.web.context.request.async.WebAsyncUtils; +import org.springframework.web.method.support.HandlerMethodReturnValueHandler; +import org.springframework.web.method.support.ModelAndViewContainer; + + +public class ObservableReturnValueHandler implements HandlerMethodReturnValueHandler { + + @Override + public boolean supportsReturnType(MethodParameter returnType) { + return Observable.class.equals(returnType.getParameterType()); + } + + @Override + public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, + NativeWebRequest webRequest) throws Exception { + + if (returnValue == null) { + return; + } + DeferredResult d = DeferredUtils.toDeferredResult((Observable) returnValue); + WebAsyncUtils.getAsyncManager(webRequest).startDeferredResultProcessing(d); + } + +} diff --git a/java-spring/transactions-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/transactions/CommandSideWebTransactionsConfiguration.java b/java-spring/transactions-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/transactions/CommandSideWebTransactionsConfiguration.java index e9c9f55..1b29be9 100644 --- a/java-spring/transactions-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/transactions/CommandSideWebTransactionsConfiguration.java +++ b/java-spring/transactions-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/transactions/CommandSideWebTransactionsConfiguration.java @@ -1,13 +1,24 @@ package net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.transactions; +import java.util.List; + import net.chrisrichardson.eventstore.javaexamples.banking.backend.commandside.transactions.MoneyTransferConfiguration; +import net.chrisrichardson.eventstore.javaexamples.banking.web.util.ObservableReturnValueHandler; + import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.web.method.support.HandlerMethodReturnValueHandler; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration @Import({MoneyTransferConfiguration.class}) @ComponentScan -public class CommandSideWebTransactionsConfiguration { +public class CommandSideWebTransactionsConfiguration extends WebMvcConfigurerAdapter { + + @Override + public void addReturnValueHandlers(List handlers) { + handlers.add(new ObservableReturnValueHandler()); + } } diff --git a/java-spring/transactions-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/transactions/MoneyTransferController.java b/java-spring/transactions-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/transactions/MoneyTransferController.java index c173e50..f5430b1 100644 --- a/java-spring/transactions-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/transactions/MoneyTransferController.java +++ b/java-spring/transactions-command-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/commandside/transactions/MoneyTransferController.java @@ -12,6 +12,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.request.async.DeferredResult; + +import rx.Observable; import rx.functions.Func1; @RestController @@ -26,16 +28,16 @@ public class MoneyTransferController { } @RequestMapping(method = RequestMethod.POST) - public DeferredResult createMoneyTransfer(@RequestBody CreateMoneyTransferRequest request) { + public Observable createMoneyTransfer(@RequestBody CreateMoneyTransferRequest request) { TransferDetails transferDetails = new TransferDetails(new EntityIdentifier(request.getFromAccountId()), new EntityIdentifier(request.getToAccountId()), request.getAmount()); - return DeferredUtils.toDeferredResult(moneyTransferService.transferMoney(transferDetails).map(new Func1, CreateMoneyTransferResponse>() { + return moneyTransferService.transferMoney(transferDetails).map(new Func1, CreateMoneyTransferResponse>() { @Override public CreateMoneyTransferResponse call(EntityWithIdAndVersion entityAndEventInfo) { return new CreateMoneyTransferResponse(entityAndEventInfo.getEntityIdentifier().getId()); } - })); + }); } }