@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
注释的类的实例化过程。 然后,您可以自己实例化该类,并使用BeanFactory
或ApplicationContext
的实例自动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.