@ServerEndpoint和@Autowired

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

Don*_*Kim 6

您似乎正在尝试集成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集成的自定义配置器).


Dud*_*mer 6

这个问题可以使用 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)


Dav*_* L. 5

实际上,您应该能够将其添加到您的类中:

@PostConstruct
public void init(){
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}
Run Code Online (Sandbox Code Playgroud)