Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring webflux“;“只允许一个连接接收订户”;如果从switchIfEmpty返回服务器响应_Spring_Spring Boot_Spring Webflux_Project Reactor - Fatal编程技术网

Spring webflux“;“只允许一个连接接收订户”;如果从switchIfEmpty返回服务器响应

Spring webflux“;“只允许一个连接接收订户”;如果从switchIfEmpty返回服务器响应,spring,spring-boot,spring-webflux,project-reactor,Spring,Spring Boot,Spring Webflux,Project Reactor,我想把一个情况,如果对象存在,然后发送错误,如果没有,然后创建新的用户 这是我的处理程序: public Mono<ServerResponse> createUser(ServerRequest request) { Mono<UserBO> userBOMono = request.bodyToMono(UserBO.class); Mono<String> email = userBOMono.map(UserBO::ge

我想把一个情况,如果对象存在,然后发送错误,如果没有,然后创建新的用户

这是我的处理程序:

public Mono<ServerResponse> createUser(ServerRequest request) {
        Mono<UserBO> userBOMono = request.bodyToMono(UserBO.class);
        Mono<String> email = userBOMono.map(UserBO::getEmail);
        Mono<User> userMono = email.flatMap(userRepository::findByEmail);
        return userMono.flatMap(user -> {
            Mono<ErrorResponse> errorResponseMono = errorHanlder.handleEmailAlreadyExist();
            return ServerResponse.status(HttpStatus.CONFLICT)
                    .contentType(MediaType.APPLICATION_JSON)
                    .body(errorResponseMono, ErrorResponse.class);
        }).switchIfEmpty(Mono.defer(() -> {
            Mono<User> newUserMono = userBOMono.flatMap(userMapping::mapUserBOToUser);
            Mono<User> dbUserMono = newUserMono.flatMap(userRepository::save);
            return ServerResponse.status(HttpStatus.CREATED)
                    .contentType(MediaType.APPLICATION_JSON)
                    .body(dbUserMono, User.class);

        }));
更新说明:其正确行为符合方法定义:

switchIfEmpty(Mono<? extends T> alternate)
Fallback to an alternative Mono if this mono is completed without data

所以,如果我想将Mono对象作为其返回发送,那么处理swtichIfEmpty情况的解决方案是什么呢。

我假设您使用WebClient来调用此API。
客户端不应订阅多次,否则可能会出现此错误

我假设您使用WebClient来调用此API。
客户端不应订阅多次,否则可能会出现此错误

最后我解决了这个问题,我读了两次userBOMono流,这导致webflux抛出这个错误

因此,这里是更新的代码,工作良好

 public Mono<ServerResponse> createUser(ServerRequest request) {
        Mono<UserBO> userBOMono = request.bodyToMono(UserBO.class);
        return userBOMono.flatMap(userBO -> {
            String email = userBO.getEmail();
            Mono<User> userMono = userRepository.findByEmail(email);
            return userMono.flatMap(user -> errorHandler.handleEmailAlreadyExist())
                    .switchIfEmpty(Mono.defer(() -> createNewUser(userBO)));
        });
    }

    private Mono<ServerResponse> createNewUser(UserBO userBO) {
        Mono<User> userMono = Mono.just(userBO).flatMap(userMapping::mapUserBOToUser).flatMap(userRepository::save);
        return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON)
                .body(userMono, User.class);

    }
公共Mono createUser(服务器请求){ Mono userBOMono=request.bodytomino(UserBO.class); 返回userBOMono.flatMap(userBO->{ 字符串email=userBO.getEmail(); Mono userMono=userRepository.findByEmail(电子邮件); 返回userMono.flatMap(用户->errorHandler.handleEmailAlreadyExist()) .switchIfEmpty(Mono.defer(()->createNewUser(userBO)); }); } 专用Mono createNewUser(UserBO UserBO){ Mono userMono=Mono.just(userBO).flatMap(userMapping::mapUserBotuser).flatMap(userRepository::save); 返回ServerResponse.ok().contentType(MediaType.APPLICATION\u JSON) .body(userMono,User.class); }
最后我解决了这个问题,我读了两次userBOMono流,导致webflux抛出这个错误

因此,这里是更新的代码,工作良好

 public Mono<ServerResponse> createUser(ServerRequest request) {
        Mono<UserBO> userBOMono = request.bodyToMono(UserBO.class);
        return userBOMono.flatMap(userBO -> {
            String email = userBO.getEmail();
            Mono<User> userMono = userRepository.findByEmail(email);
            return userMono.flatMap(user -> errorHandler.handleEmailAlreadyExist())
                    .switchIfEmpty(Mono.defer(() -> createNewUser(userBO)));
        });
    }

    private Mono<ServerResponse> createNewUser(UserBO userBO) {
        Mono<User> userMono = Mono.just(userBO).flatMap(userMapping::mapUserBOToUser).flatMap(userRepository::save);
        return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON)
                .body(userMono, User.class);

    }
公共Mono createUser(服务器请求){ Mono userBOMono=request.bodytomino(UserBO.class); 返回userBOMono.flatMap(userBO->{ 字符串email=userBO.getEmail(); Mono userMono=userRepository.findByEmail(电子邮件); 返回userMono.flatMap(用户->errorHandler.handleEmailAlreadyExist()) .switchIfEmpty(Mono.defer(()->createNewUser(userBO)); }); } 专用Mono createNewUser(UserBO UserBO){ Mono userMono=Mono.just(userBO).flatMap(userMapping::mapUserBotuser).flatMap(userRepository::save); 返回ServerResponse.ok().contentType(MediaType.APPLICATION\u JSON) .body(userMono,User.class); }
这是完整的stacktrace吗?是的,这是我在控制台中得到的,我检查了日志,似乎在返回ServerResponse之前完成了流,不确定。这是完整的stacktrace吗?是的,这是我在控制台中得到的,我检查了日志,似乎在返回ServerResponse之前完成流,不确定。问题不在客户端,问题似乎是我在读userBOMono两次,尝试查看序列是否只有一次可以工作,然后将上载我的解决方案并关闭。问题不在客户端,问题似乎是我在读userBOMono两次,尝试查看序列是否只有一次可以工作,然后将上载我的解决方案并关闭。
 public Mono<ServerResponse> createUser(ServerRequest request) {
        Mono<UserBO> userBOMono = request.bodyToMono(UserBO.class);
        return userBOMono.flatMap(userBO -> {
            String email = userBO.getEmail();
            Mono<User> userMono = userRepository.findByEmail(email);
            return userMono.flatMap(user -> errorHandler.handleEmailAlreadyExist())
                    .switchIfEmpty(Mono.defer(() -> createNewUser(userBO)));
        });
    }

    private Mono<ServerResponse> createNewUser(UserBO userBO) {
        Mono<User> userMono = Mono.just(userBO).flatMap(userMapping::mapUserBOToUser).flatMap(userRepository::save);
        return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON)
                .body(userMono, User.class);

    }