如何将字段自动连接到@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
注释的类的实例化过程。然后,您可以自己实例化该类,并使用BeanFactory
或ApplicationContext
的实例对其进行 Autowiring 。实际上,对此用法已经有类似的答案。请参阅that question和Martins的working example(特别是定制的Configurator,用于与Spring集成)。