Почему я не могу вызывать методы за пределами моего сервера websocket на Java?

#java #websocket

#java #websocket

Вопрос:

У меня есть класс сервера websocket, где я хочу печатать при подключении пользователя. Это работает без проблем, однако, если я хочу выполнить метод за пределами этого сервера websocket, он не печатает, а закрывает клиентское соединение и выводит ошибку java RuntimeException.

 package com.rupla.myapp.endpoint;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.sql.SQLException;

import javax.websocket.EncodeException;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

import com.rupla.myapp.encoders.MessageEncoder;
import com.rupla.myapp.http.MyOtherClas;
import com.rupla.myapp.encoders.MessageDecoder;

@ServerEndpoint(value = "/chatnow", encoders = MessageEncoder.class, decoders = MessageDecoder.class)
public class WebSocketServer {

    @OnOpen
    public void onOpen(Session session) {
        extracted(session);
    }

    private void extracted(Session session) {
        System.out.println("Session Opened (Client to Server) - ID: "   session.getId());
    }


    @OnMessage
    public void handleTextMessage(String message, Session s) throws IOException {
        System.out.println("New Text Message Received: "   message   " - From session: "   s.getId());
            //So here we send client's message to the client - This works
            s.getBasicRemote().sendText("Server: "   message);
        try {
            //  Here I try to print "hello" but from 'MyOtherClas'.class using printTest() method 
            MyOtherClas.printTest();
            //Right after this code, server closes the connection to the client and doesn't print anything
            }
            catch(Exception e) {
                System.out.println("fail: " e);
            }

    }



    /**
     * If I would call this method below, it would work since it's in the same class (but why?)
     */
    private void printInsideClas() {
        System.out.println("hello");

    }

    @OnClose
    public void onClose(Session session) throws IOException, EncodeException {
        System.out.println("Session Closed");
    }

    @OnError
    public void onError(Throwable t) {
        System.out.println("onError: "   t);
    }

}
  

Довольно простой сервер websocket для Java. Однако, когда я запускаю это на своем tomcat 9.0 и подключаюсь к клиенту javascript и пытаюсь отправить сообщение от моего клиента на сервер. Это закрывает соединение между сервером и клиентом, а затем выводит эту ошибку.

 Session Opened (Client to Server) - ID: 4
New Text Message Received: asd - From session: 4
onError: java.lang.RuntimeException: org/apache/http/Header
Session Closed
  

Я пытался погуглить это в течение нескольких дней, но пока у меня нет ответов, мне действительно нужна помощь с этим.

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

1. Измените свой код, чтобы напечатать stacktrace исключения …. и покажите его нам.

2. Спасибо за ответ, он действительно дает больше информации об ошибке. У меня есть HttpClient в моем пути к библиотеке. Это выдает эту ошибку при печати stacktrace: java.lang.RuntimeException: org/apache/http/Header at org.apache.tomcat.websocket.pojo.PojoMessageHandlerBase.handlePojoMethodException(PojoMessageHandlerBase.java:119) at ... 18 more Caused by: java.lang.ClassNotFoundException: org.apache.http.Header at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1363) ... 24 more Session Closed

3. Ссылка для полной ошибки: pastebin

Ответ №1:

Исключение находится в стеке веб-сервисов на стороне сервера. Исключение гласит, что он не может загрузить базовый класс, который является частью Apache HttpComponents.

Вот несколько возможных объяснений:

  • В вашей серверной среде выполнения отсутствует файл JAR.
  • JAR присутствует, но он не находится в правильном пути к классу среды выполнения.
  • Header Класс зависит от какого-то другого класса, у которого не удалось инициализировать класс. Если это произошло, в файле журнала должны быть доказательства ранее.

Файл JAR, который вы должны искать, это «httpcore-.jar «или эквивалент из старого проекта Jakarta.

Выясните, что из вышеперечисленного произошло, и вы близки к решению проблемы.