Может ли Spring 3 поддерживать WebSocket [дубликат]

def validate_age(age):
    if age >=0 :
        return True
    return False

while True:
    try:
        age = int(raw_input("Please enter your age:"))
        if validate_age(age): break
    except ValueError:
        print "Error: Invalid age."
7
задан Piotr Müller 16 March 2014 в 12:20
поделиться

5 ответов

Вы можете настроить websockets с помощью Spring Framework 3.x

. Я разработал небольшое приложение для доказательства концепции, чтобы продемонстрировать, как на основе SpringConfiguration Rossen Stoyanchev, выпущенного с весенним ядром 4.0.

Приложение устанавливает конечную точку сервера websocket с uri /wstest, которая будет использовать пружинный компонент @Autowired для выбора приветственного слова и ответа на сообщение в веб-макете.

Соединение с веб-разъемом инициировано и сообщения, отправленные с помощью html-страницы (index.html), запущенной в браузере, поддерживающем веб-сайты.

Регистрация конечной точки выполняется ServletContextListener при инициализации контекста, и когда создается конечная точка, она будет подключаться к весне:

@WebListener
public class MyApplication implements ServletContextListener {

    private final static String SERVER_CONTAINER_ATTRIBUTE = "javax.websocket.server.ServerContainer";

    @Override
    public void contextInitialized(ServletContextEvent sce) {

        ServletContext container = sce.getServletContext();

        final ServerContainer serverContainer = (ServerContainer) container.getAttribute(SERVER_CONTAINER_ATTRIBUTE);
        try {
            serverContainer.addEndpoint(new MyEndpointConfig(MyEndpoint.class, "/wstest"));
        } catch (DeploymentException e) {
            e.printStackTrace();
        }
    }
}

И конечная точка:

@Component
public class MyEndpoint extends Endpoint {

    @Autowired
    MyService myService;

    @Override
    public void onOpen(Session session, EndpointConfig config) {

        session.addMessageHandler(new MyMessageHandler(session));
    }


    class MyMessageHandler implements MessageHandler.Whole<String> {

        final Session session;

        public MyMessageHandler(Session session) {
            this.session = session;
        }

        @Override
        public void onMessage(String message) {
            try {
                String greeting = myService.getGreeting();
                session.getBasicRemote().sendText(greeting + ", got your message (" + message + "). Thanks ! (session: " + session.getId() + ")");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Осмотрите пример полного источника и готов к запуску на моей странице Github .

6
ответ дан Martins 21 August 2018 в 09:07
поделиться
  • 1
    Отличный пример! В качестве хорошей практики я бы включил листинг в (ServerContainer) в try catch. Я (лениво) скопировал ваш фрагмент и имел совершенно бесшумное исключение класса при развертывании на Tomcat из-за проблем с зависимостями. Мне понадобилось пару часов, чтобы найти проблему. – DiegoSahagun 2 September 2015 в 14:23
  • 2
    Спасибо Диего. Это хороший совет. – Martins 2 September 2015 в 21:29
  • 3
    вы можете помочь проверить мой вопрос в github. в этом коде может быть ошибка – Xiaokun 22 September 2016 в 09:18

Вы можете заставить объект @ServerEndpoint расширить SpringBeanAutowiringSupport. Затем просто сообщите ему о компонентах, которые создаются в рамках веб-приложения на основе Spring таким образом:

  @PostConstruct
    public void init() {
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
    }

Таким образом, @Autowired annotation будет правильно работать:

@Autowired MyService myService;
0
ответ дан Alex Epelde 21 August 2018 в 09:07
поделиться
0
ответ дан Sushant 21 August 2018 в 09:07
поделиться

Попробуйте

@ServerEndpoint(value = "/ws", configurator = SpringConfigurator.class)

И добавьте зависимость maven

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-websocket</artifactId>
</dependency>
1
ответ дан TGich 21 August 2018 в 09:07
поделиться

попробуйте это, он работает для меня

@Component
@ServerEndpoint(value = "/instantMessageServer",configurator = SpringConfigurator.class)
public class InstantMessageServer{
private static IChatService chatService;
    @Autowired
    public InstantMessageServer(IChatService chatService){
        this.chatService = chatService;
    }
    public InstantMessageServer(){}
}

Я нашел это решение на https://spring.io/blog/2013/05/23/spring-framework-4- 0-m1-websocket-support , но есть еще один сбой, класс, аннотированный с помощью @ServerEndpoint, не может получить httpsession с SpringConfigurator, в нем нет переопределения метода changehandler. Возможно, мы создаем отдельный конфигуратор, расширяющий SpringConfigurator и переопределить этот метод будет workaroud. Я думаю, что лучше создать веб-приложение в реальном времени с помощью spring-websocket и сообщений api.


public class ModifiedServerEndpointConfigurator extends SpringConfigurator{
    @Override
    public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
        HttpSession httpSession = (HttpSession) request.getHttpSession();
        sec.getUserProperties().put(HttpSession.class.getName(),httpSession);
        super.modifyHandshake(sec, request, response);
    }
}
0
ответ дан 何德福 21 August 2018 в 09:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: