Как правильно проанализировать данные Json, переданные в виде байтового массива на любом конце сокета - PullRequest
0 голосов
/ 26 января 2019

Я знаю, это кажется довольно простой проблемой, но все реализации, с которыми я сталкивался, похоже, не решали ситуацию.

Я передаю полиморфный объект, сопоставленный с 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, статьи и тому подобное, которыеможет решить мою проблему, также будет с благодарностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...