@ServerEndpoint和@Autowired

如何将字段自动装入@ServerEndpoint。 以下不起作用。

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

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

我使用的是Spring 3.2.1和Java 7

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

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

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

如果您不可行,则可以使用自己的ServerEndpointConfig.Configurator版本拦截使用ServerEndpoint注释的类的实例化过程。 然后,您可以自己实例化该类,并使用BeanFactoryApplicationContext的实例自动assembly它。 实际上,这种用法已有类似的答案。 查看该问题和Martins的工作示例 (特别是,与Spring集成的自定义配置器)。

可以使用SpringConfigurator(spring 4)修复此问题:

将配置程序添加到ServerEndpoint:

 @ServerEndpoint(value = "/ws", configurator = SpringConfigurator.class) 

所需的maven依赖:

  org.springframework spring-websocket ${spring.version}  

你应该可以将它实际添加到你的class级:

 @PostConstruct public void init(){ SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); } 

我的解决方案是:

 public WebsocketServletTest() { SpringApplicationListener.getApplicationContext().getAutowireCapableBeanFactory().autowireBean(this); } 

其中SpringApplicationListener是ApplicationContextAware,它将上下文存储在静态变量中

JavaEE 7规范说

 @ServerEndpoint The annotated class must have a public no-arg constructor.