首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring-rsocket支持在@ConnectMapping带注释的方法中返回RejectedSetupException吗?

spring-rsocket支持在@ConnectMapping带注释的方法中返回RejectedSetupException吗?
EN

Stack Overflow用户
提问于 2021-01-18 18:10:16
回答 1查看 133关注 0票数 2

我遵循spring-rsocket-demo项目来完成我的代码。我在服务器端代码中添加了一些身份验证逻辑,如下所示。您可以看到我在身份验证逻辑'CLIENT.add(requester)‘之后抛出了一个异常。我执行了spring-rsocket-demo项目中名为'testRequestGetsResponse‘的测试方法,但我发现我无法接收到异常。如何在@ConnectMapping带注释的方法中处理设置有效负载,并在需要时返回RejectedSetupException。

代码语言:javascript
复制
        requester.rsocket()
                .onClose()
                .doFirst(() -> {
                    // Add all new clients to a client list
                    log.info("Client: {} CONNECTED.", client);
                    //throw Exception during process setup payload
                    //my authentication code.
                    try {
//                        CLIENTS.add(requester);
                        throw new RuntimeException();
                    } catch (Exception exception) {
                        throw exception;
                    }
                })
                .doOnError(error -> {
                    // Warn when channels are closed by clients
                    log.warn("Channel to client {} CLOSED", client);
                })
                .doFinally(consumer -> {
                    // Remove disconnected clients from the client list
                    CLIENTS.remove(requester);
                    log.info("Client {} DISCONNECTED", client);
                })
                .subscribe();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-18 20:08:23

您应该按如下方式定义@ConnectionMapping方法:

代码语言:javascript
复制
@ConnectionMapping 
Mono<Void> handleSetup(@Payload String payload) {
   // Add all new clients to a client list
   log.info("Client: {} CONNECTED.", client);
   boolean isAuthenticated = ... //my authentication code.
   if (!isAuthenticated) {
     //throw Exception during process setup payload
     return Mono.error(new RejectedSetupException("connection is not authenticated"));
   }

   // add client if it is authenticated
   CLIENTS.add(requester);

   requester.rsocket()
            .onClose()
            .doFinally(consumer -> {
               // Remove disconnected clients from the client list
               CLIENTS.remove(requester);
               log.info("Client {} DISCONNECTED", client);
            })
            .subscribe();

   return Mono.empty();
}

正如您可以从上面的代码中看到的,如果连接没有通过身份验证,它将返回一个带有相应错误的Mono.error

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65772456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档