如何将字段自动连接到@ServerEndpoint。以下无效。

@Component
@ServerEndpoint("/ws")
public class MyWebSocket {
    @Autowired
    private ObjectMapper objectMapper;
}

但是,如果我删除@ServerEndpoint,它可以正常工作。

我正在使用Spring 3.2.1和Java 7

最佳答案

似乎您正在尝试将Spring和Java WebSocket API集成在一起。默认情况下,将由@Component注释的类注册到Spring Bean,并由spring将其实例作为单例进行管理。但是,将用@ServerEndpoint注释的类注册到服务器端WebSocket端点,并且每次相应端点的WebSocket连接到服务器时,其实例都由JWA实现创建和管理。因此,您不能同时使用这两个注释。

也许最简单的解决方法是使用CDI而不是Spring。当然,您的服务器应支持CDI。

@ServerEndpoint("/ws")
public class MyWebSocket {
    @Inject
    private ObjectMapper objectMapper;
}

如果您认为这不可行,则可以使用自己的ServerEndpointConfig.Configurator版本拦截用ServerEndpoint注释的类的实例化过程。然后,您可以自己实例化该类,并使用BeanFactoryApplicationContext的实例对其进行 Autowiring 。实际上,对此用法已经有类似的答案。请参阅that question和Martins的working example(特别是定制的Configurator,用于与Spring集成)。

09-25 22:23