@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
注释的类的实例化过程。然后,您可以自己实例化该类并使用BeanFactory
或ApplicationContext
的实例自动装配它。实际上,这种用法已经有类似的答案。请参阅 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的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式为 Tyrus WebSocket @ServerEndpoint 启用 WSS
@ServerEndpoint(“/websocket”)404
传统@ServerEndpoint方式开发WebSocket应用和SpringBoot构建WebSocket应用程序
从 Web Socket @ServerEndpoint 中的 HttpServletRequest 访问 HttpSession