Я пишу реактивный springboot с mysql и r2dbc. Когда я пишу запрос с помощью findByUsername, он просто возвращает строку «monotype» вместо объекта.
Код:
@Override
public Mono<UserDetails> findByUsername(String username) {
log.info("get user");
System.out.println(userRespository.findByUsername(username)); //print "monoNext" in the console
Mono<UserDetails> ans= userRespository.findByUsername(username).switchIfEmpty(Mono.error(new RuntimeException())).map(
SecurityUser::new
);
return ans;
Мой репозиторий:
@Repository
public interface UserRespository extends R2dbcRepository<User,Integer> {
@Query("SELECT * FROM user_info WHERE username = :username ;")
Mono<User> findByUsername(String username);
}
У кого-нибудь есть идея для этого?
Я ожидаю напечатать элемент внутри объекта пользователя, но я понятия не имею, как это сделать.
Это потому, что вы на самом деле печатаете Mono.toString()
, потому что репозиторий возвращает Mono
Чтобы вывести User
, когда он найден, вы должны поместить обратный вызов в свою реактивную цепочку, используя, например, оператор doOnNext()
return userRespository.findByUsername(username)
// put this callback means "when user is found, print whatever you want here"
.doOnNext(user -> System.out.println(user))
.switchIfEmpty(Mono.error(new RuntimeException()))
.map(SecurityUser::new);
что вы ожидаете здесь? вы просто печатаете здесь Mono.toString(), в чем проблема?