如何在 Spring Boot 中的两个或多个 WebSocket 控制器之间共享一个对象?

How do I share an object between two or more WebSocket controllers in Spring Boot?

我有两个控制器,即ControllerAControllerB。在 ControllerA 中,我有一个对象 (a HashMap),它将连接用户的主要名称映射到他们各自的用户名:

@Controller
public class ControllerA {
    HashMap<String, String> principalToUsername = new HashMap<>();
    ...
}

我希望能够从 ControllerB 访问此对象,这是另一个 websocket 控制器:

@Controller
public class ControllerB {
    private String getUsername(String principalName) {
        // I want to access usernames here
    }
}

我该怎么做?我读过的所有帖子都谈到了 MVC 控制器,我可以在其中使用 @SessionVariable 或 flash 属性。但是我如何使用 WebSocket 控制器完成相同的操作?

您可以创建一个额外的 @Component 来保留 HashMap<> 并将其自动连接到两个控制器中。请注意,默认情况下,这将由 Spring 应用程序中的所有控制器共享。

@Component
public class UserMap {
    private final Map<String, String> map = new HashMap<>();

    public String getUserName(String userName) {
        return map.get(userName);
    }
}

在控制器中;

private final UserMap userMap;

// autowire in constructor
public ControllerA(UserMap userMap) {
    this.userMap = userMap;
}

private String getUsername(String principalName) {
    userMap.getUserName(principalname);
}