@ServerEndpoint 和 @Autowired

Posted

技术标签:

【中文标题】@ServerEndpoint 和 @Autowired【英文标题】:@ServerEndpoint and @Autowired 【发布时间】:2015-03-27 17:39:19 【问题描述】:

如何将字段自动连接到@ServerEndpoint。以下不起作用。

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

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

我正在使用 spring 3.2.1 和 Java 7

【问题讨论】:

你有什么错误吗? objectMapper 为空。它不是注入/自动装配的 【参考方案1】:

您似乎正在尝试集成 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 的实例自动装配它。实际上,这种用法已经有类似的答案。请参阅 that question 和 Martins 的 working example(特别是用于与 Spring 集成的自定义 Configurator)。

【讨论】:

感谢您的回答。很有帮助。虽然我在更新到拥有自己的 WebSocket 实现类的 Spring 4 后才继续前进【参考方案2】:

这个问题可以使用 SpringConfigurator (spring 4) 来解决:

将配置器添加到您的 ServerEndpoint:

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

需要的maven依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-websocket</artifactId>
    <version>$spring.version</version>
</dependency>

【讨论】:

【参考方案3】:

您应该可以将其添加到您的课程中。:

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

【讨论】:

如果我将它添加到我的构造函数中,那条线就可以工作,但不是 postConstruct,它不是由我的 javax websocket 调用的。【参考方案4】:

我的解决方案是:

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

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

【讨论】:

【参考方案5】:

JavaEE 7 规范说

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

【讨论】:

我没有在示例中显示,但类中已经有一个默认构造函数。

以上是关于@ServerEndpoint 和 @Autowired的主要内容,如果未能解决你的问题,请参考以下文章

ServerEndpoint 和 web.xml

如何以编程方式为 Tyrus WebSocket @ServerEndpoint 启用 WSS

@ServerEndpoint(“/websocket”)404

传统@ServerEndpoint方式开发WebSocket应用和SpringBoot构建WebSocket应用程序

从 Web Socket @ServerEndpoint 中的 HttpServletRequest 访问 HttpSession

程序化 ServerEndpoint 在嵌入式 Tomcat 中不起作用