gpt4 book ai didi

spring - WebSockets JSR 356 Spring 集成@ServerEndpoint

转载 作者:行者123 更新时间:2023-11-28 21:55:28 25 4
gpt4 key购买 nike

问题:@ServerEndpoint 类中的@Autowired beans 为空

如何确保下面的这个 WebSocketController 类将被注入(inject) bean,即如何让它由 Spring 管理?我可以连接到 websocket,所以它可以工作,但 gameService 在 WebSocketController 类实例中始终为 null,所以我认为它是由 tomcat 以某种方式创建的,而不是 Spring。

我正在使用 Spring 引导。我只需要弄清楚如何将 bean 注入(inject)到这个 websocket Controller 类中。

WebSocketController 类

@Component
@ServerEndpoint("/sock")
public class WebSocketController {

@Autowired
private GameService gameService;

private static Set<Session> clients = Collections.synchronizedSet(new HashSet<Session>());

@OnMessage
public void handleMessage(Session session, String message) throws IOException {

session.getBasicRemote().sendText(
"Reversed: " + new StringBuilder(message).reverse());
}

@OnOpen
public void onOpen(Session session) {
clients.add(session);
System.out.println("New client @"+session.getId());
if (gameService == null) System.out.println("game service null");
}

@OnClose
public void onClose(Session session) {
clients.remove(session);
System.out.println("Client disconnected @" + session.getId());
}
}

GameService接口(interface)与实现

public interface GameService {
List<Character> getCharacters();
}

@Service
public class GameServiceMockImpl implements GameService {

@Override
public List<Character> getCharacters() {
List<Character> list = new ArrayList<>();
list.add(new Character("aaa","1.png",100));
list.add(new Character("aaa","2.jpg",100));
list.add(new Character("aaa","3.jpg",100));
return list;
}
}

应用类

@SpringBootApplication
public class App {

public static void main(String args[]){
SpringApplication.run(App.class,args);
}

@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}

}

编辑:

使用 Spring 4 WebSockets 根本不起作用,我什至无法通过浏览器连接。

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myHandler(), "/myHandler");
}

@Bean
public WebSocketHandler myHandler() {
return new MyHandler();
}

}


public class MyHandler extends TextWebSocketHandler {

@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) {
System.out.println(message.getPayload());
}

}

最佳答案

您正在尝试集成 Spring 和 Java WebSocket API。由 @Component 注解的类被注册到一个 spring bean 并且它的实例由 spring 管理,但是如果一个类被 @ServerEndpoint 注解,它被注册到一个服务器端WebSocket 端点和每次相应端点的 WebSocket 连接到服务器时,其实例由 JWA 实现创建和管理。我们不能同时使用这两个注释。

要么你可以使用CDI注入(inject)(你的服务器应该也支持)

@ServerEndpoint("/sock")
public class WebSocketController {

@Inject
private GameService gameService;

或者看看this doc,Spring 4 支持 WebSocket

关于spring - WebSockets JSR 356 Spring 集成@ServerEndpoint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34246382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com