ara*_*ant 4 java spring autowired websocket
如何将字段自动装入@ServerEndpoint.以下不起作用.
@Component
@ServerEndpoint("/ws")
public class MyWebSocket {
@Autowired
private ObjectMapper objectMapper;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我删除它@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;
}
Run Code Online (Sandbox Code Playgroud)
如果您不可行,则可以ServerEndpoint使用自己的ServerEndpointConfig.Configurator版本拦截注释类的实例化过程.然后,您可以自己实例化该类,并使用BeanFactory或的实例自动装配它ApplicationContext.实际上,这种用法已有类似的答案.查看该问题和Martins的工作示例(特别是,与Spring集成的自定义配置器).
这个问题可以使用 SpringConfigurator (spring 4) 修复:
将配置器添加到您的 ServerEndpoint:
@ServerEndpoint(value = "/ws", configurator = SpringConfigurator.class)
Run Code Online (Sandbox Code Playgroud)
所需的 Maven 依赖项:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>${spring.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
实际上,您应该能够将其添加到您的类中:
@PostConstruct
public void init(){
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8773 次 |
| 最近记录: |