Я знаю, это кажется довольно простой проблемой, но все реализации, с которыми я сталкивался, похоже, не решали ситуацию.
Я передаю полиморфный объект, сопоставленный с json с использованием библиотеки Jackson (2.9), сокету OutputStream
со стороны клиента.Объект credentials
содержит объект подтипа супертипа ClientMessage
(который является интерфейсом):
ObjectMapper jsonTester = new ObjectMapper();
ClientMessage credentials = new AuthenticationRequest(username.trim(), password.trim(), AuthenticationRequest.Type.LOGIN);
jsonTester.writeValue(socket.getOutputStream(), jsonTester.writeValueAsBytes(credentials));
Насколько проблема заключается в том, как я анализирую свои полиморфные объекты;когда я пытаюсь прочитать объект непосредственно перед его отправкой, он успешно отображает байты json обратно на исходный AuthenticationRequest
объект:
byte[] jsonBytes = jsonTester.writeValueAsBytes(credentials);
ClientMessage testMessage = jsonTester.readValue(jsonBytes, ClientMessage.class);
System.out.println(testMessage); //Prints com.providenceuniversal.gim.AuthenticationRequest@5ae63ade
Проблема возникает, когда я пытаюсь проанализировать серверную частьсокет InputStream
возвращает данные к исходному объекту:
ClientMessage request = jsonIO.readValue(handlerSocket.getInputStream(), ClientMessage.class);
Вместо этого я получаю это исключение:
com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id when trying to resolve subtype of [simple type, class com.providenceuniversal.gim.ClientMessage]: missing type id property '@type' at [Source: (SocketInputStream); line: 1, column: 1]
Вот как я инициализировал как экземпляр handlerSocket
, так и jsonIO
ObjectMapper
на сервере, код FWIW:
//...
private final Socket handlerSocket;
private final ObjectMapper jsonIO;
ClientRequestHandler(Socket handlerSocket) {
if (handlerSocket == null)
throw new IllegalArgumentException("Invalid constructor argument value");
this.handlerSocket = handlerSocket;
this.jsonIO = new ObjectMapper();
listenersExecutor.execute(() -> checkForShutdownStatus());
}
и строка json (как видно со стороны клиента):
{"@type":"AuthenticationRequest","user":{"username":"Garikai"},"password":"1234","authenticationType":"LOGIN"}
Другие ссылки SO, статьи и тому подобное, которыеможет решить мою проблему, также будет с благодарностью.