прыгучая веб-розетка не работает @Autowired - PullRequest
0 голосов
/ 25 сентября 2018

В этом классе @Autowired работает

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Autowired
    private UserDAO userDAO; // is NOT null

    @Autowired
    private IArticleService articleService; // is NOT null

    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new SocketTextHandler(), "/user").addInterceptors(new HttpHandshakeInterceptor());
    }
}

В этом классе @Autowired НЕ работает

public class HttpHandshakeInterceptor implements HandshakeInterceptor {

      @Autowired
      private IArticleService articleService; // is null

      @Autowired
      private UserDAO userDAO; // is null

    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {

    }

Может быть, это что-то вроде канала wss?

1 Ответ

0 голосов
/ 25 сентября 2018

Ваш экземпляр HttpHandshakeInterceptor не управляется Spring (т. Е. Вы создаете свой экземпляр с помощью new).

У вас есть два варианта:

1.Сделайте HttpHandshakeInterceptor Принять параметры типа UserDAO и IArticleService

public class HttpHandshakeInterceptor implements HandshakeInterceptor {

      private IArticleService articleService;

      private UserDAO userDAO;

      public HttpHandshakeInterceptor(UserDAO userDAO, IArticleService articleService){
          this.userDAO = userDAO;
          this.articleService = articleService;
      }

    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {

    }

Поместите @Component поверх HttpHandshakeInterceptor

@Component
public class HttpHandshakeInterceptor implements HandshakeInterceptor {

    @Autowired
    private IArticleService articleService; // is null

    @Autowired
    private UserDAO userDAO; // is null

    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {

    }
}

и используйте @Autowired в своей конфигурации:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Autowired
    private UserDAO userDAO;

    @Autowired
    private IArticleService articleService;

    @Autowired
    private HttpHandshakeInterceptor interceptor;

    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new SocketTextHandler(), "/user").addInterceptors(interceptor);
    }
}

Youтакже можно достичь того, чего вы достигли, с помощью аннотации @Component с определением @Bean в одном из ваших файлов @Configuration.

Кроме того, вы также можете пойти по пути @Configurable, но из того, что я вижув данный момент вам это не нужно.

...