Удаление ExecControl для обновления до Ratpack v1.1.1?

Я изучаю Ratpack и работаю с несколькими ресурсами. У меня есть следующий интерфейс и класс, который работает в Ratpack v0.9.18, но не работает в v1.1.1 из-за удаления интерфейса ExecControl.

//file: src/main/groovy/app/UserService.groovy
package app
import ratpack.exec.Promise
interface UserService {
  Promise<Void> save (User user)
  Promise<List<User>> getUsers ()
}

//file: src/main/groovy/app/DefaultUserService.groovy
package app
import ratpack.exec.ExecControl
import ratpack.exec.Promise
class DefaultUserService implements UserService {
  private final List storage = []
  @Override
  Promise<Void> save (User user) {
    storage << user
    ExecControl.current ().promiseOf (null)
  }
  @Override
  Promise<List<User>> getUsers () {
    ExecControl.current ().promiseOf (storage)
  }
}

Я думал, что изменение строки с ExecControl с:

Promise.of (storage)

будет работать, но в результате

MissingMethodException: No signature of method: static ratpack.exec.Promise.of() is applicable for argument types: (java.util.ArrayList).

Метод Promise.of () ожидает тип ratpack.exec.Upstream.

Как изменить класс DefaultUserService, указанный выше, для работы с Ratpack v1.1.1?

1 ответ

Решение

Promise.of(Upstream) http://ratpack.io/manual/current/api/ratpack/exec/Promise.html - это способ сообщить о результате какого-то процесса нижестоящим потребителям. Вы можете сообщить, было ли что-то успешно завершено через Downstream#error(Throwable) или же Downstream#success(value) http://ratpack.io/manual/current/api/ratpack/exec/Downstream.html

Вы также можете создать Promise от известного значения через Promise.value(value)

В дополнение к Promise Ratpack также обеспечивает ratpack.exec.Operation который похож на Promise<Void> в том, что он представляет асинхронную работу без возвращаемого типа.

Я собрал образец, чтобы продемонстрировать различные способы создания представления асинхронной работы.

@Grab('io.ratpack:ratpack-groovy:1.1.1')

import ratpack.exec.Operation
import ratpack.exec.Promise
import ratpack.handling.Context

import ratpack.jackson.Jackson

import static ratpack.groovy.Groovy.ratpack

class User { String name }

class UserService {
    private final List<User> storage = []

    Operation save(User user) {
        storage << user
        Operation.noop()
    }

    Promise<List<User>> getUsers() {
        Promise.of { downstream -> downstream.success(storage) }
        // or
//      Promise.value(storage)
    }
}
ratpack {
    bindings {
        bindInstance new UserService()
    }
    handlers {
        get { Context ctx, UserService userService ->
            userService.getUsers()
                    .map(Jackson.&json)
                    .then(ctx.&render)
        }
        get('add/:name') { UserService userService ->
            userService.save(new User(name: pathTokens.get('name')))
                    .then { render 'User saved' }
        }
    }
}

Вот несколько примеров команд curl, которые я выполнил для этого:

$ curl localhost:5050
[]

$ curl localhost:5050/add/dan
User saved

$ curl localhost:5050/
[{"name":"dan"}]

$ curl localhost:5050/add/luke
User saved

$ curl localhost:5050/
[{"name":"dan"},{"name":"luke"}]
Другие вопросы по тегам