簡體   English   中英

如何獲取數據,然后使用 Spring Webflux 從數據庫中刪除它?

[英]How to Fetch Data and then Delete it from database using Spring Webflux?

刪除操作不起作用。 我如何獲取數據然后以功能方式刪除它? 代碼成功運行,但未刪除數據庫中的數據。

Controller Class

    @DeleteMapping("/deleteUserById/{userId}")
    public Mono<ResponseEntity<String>> deleteUserById(@PathVariable Long userId) {
        return userService.deleteUserById(userId);
    }

用戶服務 Class

    @Override
    public Mono<ResponseEntity<String>> deleteUserById(Long userId) {
        return userRepository.findById(userId)
                .map(user -> {
                    UserDto deletedUser = UserMapper.USER_MAPPER_INSTANCE.toUserDto(user);
                    return "User: " + deletedUser.getUsername() + " deleted!";
                })
                .doOnNext(user -> {
                    userRepository.deleteUserById(userId);
                })
                .map(ResponseEntity::ok)
                .defaultIfEmpty(ResponseEntity
                      .status(HttpStatus.NOT_FOUND)
                      .body("UserId: " +       userId + " Not found"));

   }

存儲庫接口

@EnableR2dbcRepositories
public interface UserRepository extends ReactiveCrudRepository<User, Long> {

    @Query("SELECT * FROM tb_user WHERE username LIKE $1")
    Mono<User> findByUsername(String username);

    @Query("DELETE FROM tb_user WHERE userid = $1")
    Mono<User> deleteUserById(Long userId);

}

Postgres 表

警報系統=# select * 來自 tb_user;

用戶名 | 用戶名 | 姓名 | email | 密碼 | ph_number | 出生日期| 角色
------+------------+------------+------------ --------------+------------+------------+---------- ----+--------

  5 | am0007   | Ajay Maharjan | ajay007@gmail.com | asdfgh1  | 558955697 | 1999-05-21    | ADMIN

Output

案例:不可用的 userId

UserId: 3 Not found

case:可用的userId

User: am0007 deleted!

我正在嘗試以反應方式刪除數據庫中的數據。 我得到預期的 output 但刪除操作不起作用。

這是因為deleteUserById()是一個反應性操作。 它返回Mono ,但您在doOnNext()方法中調用它,因此沒有人會訂閱它。 記住規則:在您訂閱之前什么都不會發生

問題是doOnNext()只是為了產生一些副作用,例如,記錄一些東西。

您應該在flatMap()運算符中調用 delete 方法

.flatMap(user -> {
    userRepository.deleteUserById(userId);
})

因此下游訂閱從該 flatMap 返回的Mono


deleteUserById()返回了mono<Void>盡管聲明了Mono<User> 所以我所做的是,我將它更改為Mono<Void>然后添加.thenReturn(user)從 flatMap 返回Mono<User>

return userRepository.findById(userId)
            .flatMap(user -> userRepository.deleteUserById(userId).thenReturn(user))
            .map(user -> {
                log.info("Deleted User: {}", user);
                return ResponseEntity.status(HttpStatus.OK).body("User: " + user.getUsername() + " deleted!");
            })
            .defaultIfEmpty(ResponseEntity.status(HttpStatus.NOT_FOUND).body("UserId: " + userId + " Not found"));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM