Примечание:
Суть этого вопроса не в том, чтобы просто вернуть значение, которое я в конечном итоге хочу.
Я могу сделать это, просто не используя Optional
. Мне бы хотелось элегантное решение, чтобы я мог начать возвращать Optional.
Объяснение того, что я пытался сделать:
Я использовал QueryGateway
с подписью, которая будет запросить мой обработчик. Я разбил свой код, чтобы вы могли видеть, что на моем CompletableFuture
я сделаю блокировку get, чтобы получить Optional
, который содержит объект, который я действительно хочу. Обратите внимание , что я не ищу класс, который содержит мой необязательный. Если это не элегантно, тогда я могу просто выполнить проверку на ноль.
Вызов запроса работает, но я получаю следующую ошибку:
org.axonframework.axonserver.connector.query.AxonServerQueryDispatchException: CANCELLED: HTTP/2 error code: CANCEL
Received Rst Stream
AXONIQ-5002
58484@DESKTOP-CK6HLMM
Пример кода, который инициирует запрос:
UserProfileOptionByUserQuery q = new UserProfileOptionByUserQuery(userId);
CompletableFuture<Optional<UserProfile>> query =
queryGateway.query(q,ResponseTypes.optionalInstanceOf(UserProfile.class));
Optional<UserProfile> optional = query.get();
Ошибка возникает при вызове query.get()
.
Пример моего обработчика запросов:
@QueryHandler
Optional<UserProfile> handle(UserProfileOptionByUserQuery query, @MetaDataValue(USER_INFO) UserInfo userInfo) {
assertUserCanQuery(query, userInfo);
return userProfileRepository.findById(query.getUserId());
}
Обработчик запросов работает нормально. Другие действия, такие как использование OptionalResponseType
, не инициировали бы мой запрос по желанию.