Страницы

Поиск по вопросам

воскресенье, 8 декабря 2019 г.

Контроллер не получает данные от websoket,a

#javascript #java #spring #websocket


Пишу чат на вебсокетах. Использую sockjs.js и stomp.js. Соединение проходит успешно,
сабскрайб на рассылку тоже. Но при попытке отправить на бекенд сообщение (для рассылки
всем присоеденившимся к чату) на нужный контролллер ничего не приходит, хотя в консоль
либа пишет что данные отправила:

>>> SEND
destination:/app/app-dest-prefix/chat
content-length:76

{"from":"Lesha","text":"message","timeCreation":"2017-10-12T15:26:29.410Z"}


так я присоединяюсь

stompClient = Stomp.over(new SockJS("/ContactBook/app/cbxSoc"));


так сабскрайблюсь:

stompClient.subscribe('/topic/messages', function (message) {
                console.log(message);
            });


так я отправляю сообщение:

stompClient.send("/app-dest-prefix/chat", {}, JSON.stringify({'from':'Lesha', 'text':$scope.chatInput,
'timeCreation':new Date()})


такой у меня контроллер

@Controller
public class ChatController {

@MessageMapping("/chat")
@SendTo("/topic/messages")
public Message send(Message message){
    String time = new SimpleDateFormat("HH:mm").format(new Date());
    message.setTimeCreation(time);
    return message;
}


}

такая конфигурация:

@Configuration
@EnableWebSocketMessageBroker
public class CbxSocketConfig extends AbstractWebSocketMessageBrokerConfigurer{

@Override
public void registerStompEndpoints(StompEndpointRegistry ser) {
    ser.addEndpoint("/cbxSoc").withSockJS();
}

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    // Prefix for messages FROM client TO server
    config.setApplicationDestinationPrefixes("/app-dest-prefix");
    // Prefix for messages FROM server TO client
    config.enableSimpleBroker("/events", "/topic", "/queue");
    config.setUserDestinationPrefix("/user");

}

}


Подскажите, кто в курсе, где я ошибся. Спасибо. Такое ощущение, что урл не верный
указал, но судя по документации всё правильно...

UPD
Может кто-то знает как отхендлить вообще всё. что приходит от клиента (не только
по определённому пути, который указана в @MessageMapping("/chat"))?

UPD2
Добавил хендлер для отлавливания вообще всех сообщению вебсокета

 @Override
public void configureClientInboundChannel(ChannelRegistration registration) 
{
    registration.setInterceptors(new MyChannelInterceptor());
}

public class MyChannelInterceptor extends ChannelInterceptorAdapter {

@Override
public Message preSend(Message message, MessageChannel channel) {
    StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
    //StompCommand command = accessor.getStompCommand();
    return message;
}
}


При отправке клиентом сообщения этот хендлер его отлавливает, но на контроллер всё
равно не доходит..

UPD3 пример лог мапинга

2017-10-22 20:30:19  INFO RequestMappingHandlerMapping:220 - Mapped "{[/client/managers],methods=[GET],params=[],headers=[],consumes=[],produces=[application/json],custom=[]}"
onto public java.util.List com.miroktell.contactbook.controllers.ClientController.getManagers()
2017-10-22 20:30:19  INFO RequestMappingHandlerMapping:220 - Mapped "{[/client/filter],methods=[POST],params=[],headers=[],consumes=[],produces=[application/json],custom=[]}"
onto public com.miroktell.contactbook.containers.RowsContainer com.miroktell.contactbook.controllers.ClientController.getClientsByFilter(com.miroktell.contactbook.containers.ClientListFilter)
throws java.io.IOException
2017-10-22 20:30:19  INFO RequestMappingHandlerMapping:220 - Mapped "{[/client/getFullClientByPhoneNumber],methods=[GET],params=[],headers=[],consumes=[],produces=[application/json],custom=[]}"
onto public com.miroktell.contactbook.model.Client com.miroktell.contactbook.controllers.ClientController.getFullClientByPhoneNumber(java.lang.String)
2017-10-22 20:30:19  INFO RequestMappingHandlerMapping:220 - Mapped "{[/client/addNotice],methods=[POST],params=[],headers=[],consumes=[],produces=[application/json],custom=[]}"
onto public com.miroktell.contactbook.utils.MyMesage com.miroktell.contactbook.controllers.ClientController.addNotice(com.miroktell.contactbook.model.ClientNotice)
2017-10-22 20:30:19  INFO RequestMappingHandlerMapping:220 - Mapped "{[/util/filter/delete/{id}],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}"
onto public com.miroktell.contactbook.utils.MyMesage com.miroktell.contactbook.controllers.UtilController.deleteFilter(int)
2017-10-22 20:30:19  INFO SimpleUrlHandlerMapping:315 - Mapped URL path [/**] onto
handler of type [class org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler]
2017-10-22 20:30:19  INFO RequestMappingHandlerAdapter:523 - Looking for @ControllerAdvice:
WebApplicationContext for namespace 'dispatcher-servlet': startup date [Sun Oct 22
20:30:18 EEST 2017]; parent: Root WebApplicationContext

    


Ответы

Ответ 1



1) Вы отсылаете JSON строку, соответственно вы должны прописать в конструкторе соответствующие аннотация для разбора данных 2) Не работал с этой веткой АПИ, но мне кажется Вам стоит поиграться с конфигурацией, а именно enableSimpleBroker("/events", "/topic", "/queue") .У Вас неявно указана ссылка, по которой контроллер должен считывать данные. В Вашем же случаи это должно быть @MessageMapping("/app-dest-prefix/chat"). Пробуйте

Ответ 2



Проблема осталась не решенной. Вышел из ситуации (пока не разберусь) таким образом. Сообщение на бэкенд отправляю через обычный http, а уже рассылку всем сабскрайберам осуществляю через вебсокет. @RequestMapping(value = "/testChat", method = RequestMethod.POST, headers="Accept=application/json") public void testChat(@RequestBody Message message){ Logger.getLogger(NotificationController.class.getName()).log(Level.SEVERE, "RECEIVED MESSAGE FROM CLIENT: \n"+message); this.simpMessagingTemplate.convertAndSend("/topic/messages", message); Logger.getLogger(NotificationController.class.getName()).log(Level.SEVERE, "SENDED THIS MESSAGE TO ALL SUBSCRIBERS: /topic/messages"); } Понимаю что так делать - полный бред, но пока проблема не решена, это вроде как единственный рабочий способ...Спасибо @GenCloud за попытку помочь.

Комментариев нет:

Отправить комментарий