2015-12-12 3 views
1

Проблема: @Autowired бобы в классе @ServerEndpoint нулевыеWebSockets JSR 356 Spring интеграция @ServerEndpoint

Как я могу убедиться, что этот WebSocketController класс ниже будет закачиваться с фасолью, то есть, как я могу это сделать управляемый Весной? Я могу подключиться к websocket таким образом, чтобы он работал, но gameService всегда имеет значение null внутри экземпляра класса WebSocketController, поэтому я думаю, что он создан tomcat каким-то образом, а не Spring.

Я использую весенний ботинок. Мне просто нужно выяснить, как вставлять bean-компоненты в этот класс контроллера websocket.

WebSocketController класс

@Component 
@ServerEndpoint("/sock") 
public class WebSocketController { 

    @Autowired 
    private GameService gameService; 

    private static Set<Session> clients = Collections.synchronizedSet(new HashSet<Session>()); 

    @OnMessage 
    public void handleMessage(Session session, String message) throws IOException { 

     session.getBasicRemote().sendText(
       "Reversed: " + new StringBuilder(message).reverse()); 
    } 

    @OnOpen 
    public void onOpen(Session session) { 
     clients.add(session); 
     System.out.println("New client @"+session.getId()); 
     if (gameService == null) System.out.println("game service null"); 
    } 

    @OnClose 
    public void onClose(Session session) { 
     clients.remove(session); 
     System.out.println("Client disconnected @" + session.getId()); 
    } 
} 

интерфейс и реализация GameService

public interface GameService { 
    List<Character> getCharacters(); 
} 

@Service 
public class GameServiceMockImpl implements GameService { 

    @Override 
    public List<Character> getCharacters() { 
     List<Character> list = new ArrayList<>(); 
     list.add(new Character("aaa","1.png",100)); 
     list.add(new Character("aaa","2.jpg",100)); 
     list.add(new Character("aaa","3.jpg",100)); 
     return list; 
    } 
} 

Класс Применение

@SpringBootApplication 
public class App { 

    public static void main(String args[]){ 
     SpringApplication.run(App.class,args); 
    } 

    @Bean 
    public ServerEndpointExporter serverEndpointExporter() { 
     return new ServerEndpointExporter(); 
    } 

} 

РЕДАКТИРОВАТЬ:

Использование Пружина 4 Вт ebSockets не работает вообще, я не могу даже подключиться через браузер.

@Configuration 
@EnableWebSocket 
public class WebSocketConfig implements WebSocketConfigurer { 

    @Override 
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { 
     registry.addHandler(myHandler(), "/myHandler"); 
    } 

    @Bean 
    public WebSocketHandler myHandler() { 
     return new MyHandler(); 
    } 

} 


public class MyHandler extends TextWebSocketHandler { 

    @Override 
    public void handleTextMessage(WebSocketSession session, TextMessage message) { 
     System.out.println(message.getPayload()); 
    } 

} 

ответ

1

Вы пытаетесь интегрировать API Spring и Java WebSocket. Класс, аннотированный @Component, зарегистрирован для весеннего компонента, а его экземпляр управляется весной, но если класс аннотируется @ServerEndpoint, он зарегистрирован на конечной точке WebSocket на стороне сервера и каждый раз, когда к серверу подключается соответствующий веб-узел конечной точки, его экземпляр создается и управляется реализацией JWA. Мы не можем использовать обе аннотации вместе.

Либо вы можете использовать CDI инъекции (ваш сервер должен также поддерживать)

@ServerEndpoint("/sock") 
public class WebSocketController { 

    @Inject 
    private GameService gameService; 

Или взглянуть на this документ, Spring 4 поддерживает WebSocket

+0

Спасибо за ответы. Я бы предпочел использовать Spring 4 WebSocket, и я хочу использовать «прямой подход» без SockJS и тому подобное. Поэтому я создал TextWebSocketHandler и WebSocketConfigurer. Но это не сработает. Я не могу подключиться из браузера. Он говорит в консоли, что он сопоставил данный url с текстовым обработчиком, но все еще не может подключиться. Я добавил код в главный пост. – Greyshack

+1

Мне пришлось разрешать соединения от другого источника, и это работает. Таким образом, в конце я использую Spring 4 websockets. – Greyshack

+0

Это круто, но я не думаю, что это лучшая практика. – Pulkit

2

Может быть, эта статья может помочь:

https://spring.io/blog/2013/05/23/spring-framework-4-0-m1-websocket-support

Вы можете использовать зависимость (с пружинной версии> 4)

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-websocket</artifactId> 
    <version>${spring.version}</version> 
</dependency> 

А потом просто

@ServerEndpoint(value = "/echo", configurator = SpringConfigurator.class) 
public class WebSocketEndpoint { 

    @Inject 
    private BroadcastService broadcaster; 
+0

Ницца и легко. Это то, что заставило его работать на меня! – LordOfThePigs

+0

Спасибо тонну! работа для меня –