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

I have two controllers, namely ControllerA and ControllerB. In ControllerA I have an object (a HashMap) which maps principal names for connected users to their respective usernames:

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

I would like to be able to access this object from ControllerB, which is another websocket controller:

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

How can I do this? All posts I've read speak about MVC controllers, in which I can use @SessionVariable or flash attributes. But how do I accomplish the same with WebSocket controllers?



Solution 1:[1]

You could create an additional @Component which keeps the HashMap<> and autowire it into both controllers. Be aware that by default, this will be shared by all controllers in the Spring application.

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

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

In the controller;

private final UserMap userMap;

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

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

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 JayTheKay