сделать http ответ в обратном вызове - PullRequest
1 голос
/ 25 октября 2019

Я читаю документацию Micronaut, но не могу найти способ отрисовки ответа http в обратном вызове, как я могу это сделать, например, с Jax-Rs Jersey.

Вот чего я хочу достичь

@Get("/scalaFuture")
public void getScalaFuture() {
    Futures.successful(new SpringBootEntityDaoDTO())
            .onComplete(result -> {
                if (result.isSuccess()) {
                    return HttpResponse.ok(result.get());
                } else {
                    return HttpResponse.serverError(result.failed().get());
                }
            }, ExecutorContextUtil.defaultExecutionContext());
}

В основном визуализируйте ответ в обратном вызове будущего.

Нечто подобное, как я делаю с JaxRS в наблюдаемом обратном вызове с использованием AsyncResponse

@POST
@Path("/bla")
public void foo(@Suspended final AsyncResponse asyncResponse) {
    Observable<EntityDaoDTO> observable = observableFosConnectorManager.execute("EntityAggregateRoot", "database", getEntityDaoDTO(), null, MethodDTO.CREATE);
    observable
            .subscribeOn(Schedulers.computation())
            .subscribe(result -> {
                EntityPayLoad entityPayLoad = new EntityPayLoad();
                entityPayLoad.setTitle(result.getTitle());
                entityPayLoad.setDescription(result.getDescription());
                asyncResponse.resume(Response.status(Response.Status.OK.getStatusCode()).entity(entityPayLoad).build());
            }, t -> asyncResponse.resume(Response.status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).build()),
            () -> getLogger().info(null, "Subscription done"));
}

Regards

1 Ответ

1 голос
/ 25 октября 2019

Micronaut допускает разные типы возврата, включая реактивные ответы.

Например, вы можете вернуть CompletableFuture:

@Controller("/people")
public class PersonController {

    Map<String, Person> inMemoryDatastore = new ConcurrentHashMap<>();

    @Post("/saveFuture")
    public CompletableFuture<HttpResponse<Person>> save(@Body CompletableFuture<Person> person) {
        return person.thenApply(p -> {
                    inMemoryDatastore.put(p.getFirstName(), p);
                    return HttpResponse.created(p);
                }
        );
    }

}

Преобразовать ваше будущее в scala в будущее, которое можно завершить на Java: https://stackoverflow.com/a/46695386/2534803

https://docs.micronaut.io/latest/guide/index.html#_binding_using_completablefuture

...