В настоящее время я реализую функцию поиска, при которой введенная пользователем строка отправляется на сервер, который просматривает базу данных и отправляет всех пользователей, имя пользователя которых соответствует данной строке, обратно клиенту. Для передачи я использую пользовательский класс Message
, который содержит строку, содержащую действие, которое должно быть выполнено (здесь не имеет значения), и объект, который является фактическим сообщением. В этом случае это будет ArrayList<User>
. Я использую метод writeObject()
из ObjectOutputStream
и readObject()
из ObjectInputStream
для передачи данных. После получения данных я приведу объект к объекту сообщения, и именно здесь я получаю исключение. Примечание: приведение к Message прекрасно работает в любой другой точке кода, но здесь выдается исключение.
Исключение:
Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: java.io.ObjectStreamClass cannot be cast to gruber.common.Message
at gruber.client.controller.ChatRoomController.lambda$searchForUser$2(ChatRoomController.java:105)
at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
at java.lang.Thread.run(Thread.java:748)
Сторона клиента:
private void searchForUser(){
try {
oos.writeObject(new Message("SEARCH", searchfield.getText()));
oos.flush();
Message results = (Message)ois.readObject();
ArrayList<User> users = (ArrayList<User>)results.getMsg();
for(User u: users) {
System.out.println(u.getUsername());
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Серверная часть:
private void search() throws SQLException, IOException {
Message client_msg = (Message) client.getOis().readObject();
String searchParam = client_msg.getMsg();
PreparedStatement searchUsers = con.prepareStatement("SELECT username, image from chatuser where username like ?");
searchUsers.setString(1, searchParam);
ResultSet results = searchUsers.executeQuery();
ArrayList<User> users = new ArrayList<>();
while (results.next()) {
users.add(new User(results.getString(1), results.getBytes(2)));
}
client.getOos().writeObject(new Message("SEARCH", users));
client.getOos().flush();
}
Класс сообщения (при необходимости):
package gruber.common;
import java.io.Serializable;
public class Message implements Serializable {
private String action;
private Object msg;
public Message(String action, Object msg) {
this.action = action;
this.msg = msg;
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public Object getMsg() {
return msg;
}
public void setMsg(Object msg) {
this.msg = msg;
}
}