Как исправить "Внутреннюю ошибку сервера" при использовании EventBus в пользовательском AuthProvider
Использование vert.x EventBus в пользовательском AuthProvider действительно выдает "Внутреннюю ошибку сервера" при будущем завершении.
Встроенный пользовательский AuthProvider, который получает пользовательские данные из EventBus. EventBus и пользовательские данные возвращаются правильно, но после successededFuture() в обработчике я получаю только "Internal Server Error". Могу ли я испортить обработчик и асинхронный режим EventBus.send()?
package tld.domain.auth;
import io.vertx.core.AsyncResult;
import io.vertx.core.Future;
import io.vertx.core.Handler;
import io.vertx.core.Vertx;
import io.vertx.core.eventbus.EventBus;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.auth.AuthProvider;
import io.vertx.ext.auth.User;
public class MyAuthProvider implements AuthProvider {
private final EventBus eventBus;
public MyAuthProvider(Vertx vertx) {
this.eventBus = vertx.eventBus();
}
public static MyAuthProvider create(Vertx vertx) {
return new MyAuthProvider(vertx);
}
@Override
public void authenticate(JsonObject jsonObject, Handler<AsyncResult<User>> handler) {
try {
eventBus.send("hello", null, message -> {
try {
if (true) {
handler.handle(Future.succeededFuture(new MyAuthUser()));
} else {
handler.handle(Future.failedFuture("failed by purpose"));
}
} catch (Exception e) {
e.printStackTrace();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
package tld.domain.auth;
import io.vertx.core.AsyncResult;
import io.vertx.core.Future;
import io.vertx.core.Handler;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.auth.AbstractUser;
import io.vertx.ext.auth.AuthProvider;
public class MyAuthUser extends AbstractUser {
@Override
protected void doIsPermitted(String s, Handler<AsyncResult<Boolean>> handler) {
handler.handle(Future.succeededFuture(true));
}
@Override
public JsonObject principal() {
return null;
}
@Override
public void setAuthProvider(AuthProvider authProvider) {
}
}
И в статье
_router = Router.router(vertx);
MyAuthProvider authProvider = MyAuthProvider.create(vertx);
// router auth session storage
_router.route().handler(CookieHandler.create());
_router.route().handler(SessionHandler.create(LocalSessionStore.create(vertx)).setAuthProvider(authProvider));
// router basic auth
AuthHandler basicAuthHandler = BasicAuthHandler.create(authProvider);
_router.route().handler(basicAuthHandler);
_router.route().handler(BodyHandler.create());
_router.get("/hello").handler(this::getHelloHandler);
Удаление eventbus.send() делает пример работающим (получая правильный ответ). Добавление событийной шины портит результат, получая только "Внутреннюю ошибку сервера" вместо ответа.
Есть ли проблема с обработчиком и async eventbus.send(), или я пропускаю какую-то другую важную концепцию vert.x?
1 ответ
Я нашел решение, поменяв местами порядок регистрации BodyHandler и AuthHandler.
// BodyHandler FIRST !!!
_router.route().handler(BodyHandler.create());
// AuthHandler SECOND
_router.route().handler(_basicAuthHandler);
// DO NOT CREATE BodyHandler AFTER AuthHandler
//_router.route().handler(BodyHandler.create());