복붙노트

[SPRING] 스프링 데이터 mongodb 및 kotlin을 사용하여 개체를 업데이트하는 중입니다.

SPRING

스프링 데이터 mongodb 및 kotlin을 사용하여 개체를 업데이트하는 중입니다.

다음 요청 처리기가 있습니다.

fun x(req: ServerRequest) = req.toMono()
    .flatMap {
        ...
        val oldest = myRepository.findOldest(...) // this is the object I want to modify
        ...
        val v= anotherMongoReactiveRepository.save(Y(...)) // this saves successfully
        myRepository.save(oldest.copy(
                remaining = (oldest.remaining - 1)
        )) // this is not saved
        ok().body(...)
    }

그리고 다음의 mongodb reactive 저장소

@Repository
interface MyRepository : ReactiveMongoRepository<X, String>, ... {
}

문제는 save () 메서드를 실행 한 후에도 객체에 아무런 변화가 없다는 것입니다. save (). block ()으로 문제를 해결할 수 있었지만 왜 다른 저장소의 첫 번째 저장이 작동하는지 알 수 없습니다. 이 블록 ()이 필요한 이유는 무엇입니까?

해결법

  1. ==============================

    1.누군가가 반응적인 게시자를 구독 할 때까지는 아무 일도 일어나지 않습니다. 그것이 block ()을 사용할 때 작동하기 시작한 이유입니다. DB에 대한 호출을하고 map (), flatMap ()과 같은 Mono / Flux 연산자를 사용하는 것보다 다른 DB 요청에서 결과를 사용해야하는 경우 필요한 모든 작업과 그 결과로 얻은 결과의 파이프 라인을 작성해야합니다 컨트롤러의 응답으로 모노 / 플럭스. Spring은 해당 Mono / Flux에 가입하고 요청을 반환합니다. 차단할 필요가 없습니다. 그리고 block () 메소드를 사용하는 것은 권장하지 않습니다.

    누군가가 반응적인 게시자를 구독 할 때까지는 아무 일도 일어나지 않습니다. 그것이 block ()을 사용할 때 작동하기 시작한 이유입니다. DB에 대한 호출을하고 map (), flatMap ()과 같은 Mono / Flux 연산자를 사용하는 것보다 다른 DB 요청에서 결과를 사용해야하는 경우 필요한 모든 작업과 그 결과로 얻은 결과의 파이프 라인을 작성해야합니다 컨트롤러의 응답으로 모노 / 플럭스. Spring은 해당 Mono / Flux에 가입하고 요청을 반환합니다. 차단할 필요가 없습니다. 그리고 block () 메소드를 사용하는 것은 권장하지 않습니다.

    Java에서 MongoDB reactive 리포지토리를 사용하는 간단한 예제 :

    @GetMapping("/users")
    public Mono<User> getPopulation() {
        return userRepository.findOldest()
                .flatMap(user -> {              // process the response from DB
                    user.setTheOldest(true);
                    return userRepository.save(user);
                })
                .map(user -> {...}); // another processing
    }
    
  2. from https://stackoverflow.com/questions/49151066/updating-object-with-spring-data-mongodb-and-kotlin-is-not-working by cc-by-sa and MIT license