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."
Вы можете настроить 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 .
Вы можете заставить объект @ServerEndpoint расширить SpringBeanAutowiringSupport. Затем просто сообщите ему о компонентах, которые создаются в рамках веб-приложения на основе Spring таким образом:
@PostConstruct
public void init() {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}
Таким образом, @Autowired annotation будет правильно работать:
@Autowired MyService myService;
Попробуйте
@ServerEndpoint(value = "/ws", configurator = SpringConfigurator.class)
И добавьте зависимость maven
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
</dependency>
попробуйте это, он работает для меня
@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);
}
}