Пользовательский класс сталкивается с исключением сериализации «Обработка идентификатора типа не реализована для типа ...» - PullRequest
0 голосов
/ 04 июня 2019

У меня есть определенный пользователем класс, как показано ниже (код groovy):

    @CompileStatic
    @JsonSerialize(using = JsonSerializer)
    @JsonDeserialize(using = JsonDeserializer)
    class SensitiveString implements Serializabl{
        private String rawString

        SensitiveString(String raw) {
            rawString = raw
        }

        Object asType(Class clazz) {
            assert clazz == String: "Cannot cast Sensitive String to type other than string. "
            return this.toString()
        }

        @Override
        String toString() {
            return rawString
        }

        boolean equals(SensitiveString other){
            return other.rawString == rawString
        }

        static class JsonSerializer extends StdSerializer<SensitiveString> {

            JsonSerializer() {
                super(SensitiveString.class)
            }

            @Override
            void serialize(SensitiveString value, JsonGenerator gen, SerializerProvider provider) throws IOException {
                if (value == null || value.rawString == null) {
                    gen.writeNull()
                    return
                }
                gen.writeString(SensitiveDataGuard.INSTANCE.encryptData(value.rawString))
            }
        }

        static class JsonDeserializer extends StdDeserializer<SensitiveString> {

            JsonDeserializer() {
                super(SensitiveString.class)
            }

            @Override
            SensitiveString deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
                String encrypted = p.readValueAs(String)
                if (encrypted == null)
                    return null
                return new SensitiveString(SensitiveDataGuard.INSTANCE.decryptData(encrypted))
            }
        }
    }

и есть класс User, который:

    class User implements Serializable{
        String name;
        SensitiveString passed;
        ...
    }

Я использую Mybatis в своем проекте, в UserMapper есть метод listUsersBy, при вызове этого метода я получаю следующее исключение:

[Обработка идентификатора типа не реализована для типа mypackage.SensitiveString (сериализатором типа mypackage.SensitiveString $ JsonSerializer) (через цепочку ссылок: java.util.ArrayList [0] -> mypackage.User ["пройдено"])]

копаясь в проблемах, я обнаружил, что это связано с сериализацией в обработке вторичного кэша. Я использую redis для кэширования второго уровня Mybatis с JSON-анализатором GenericJackson2JsonRedisSerializer.

    redisTemplate.setKeySerializer(new StringRedisSerializer())
    redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer())
    redisTemplate.setHashKeySerializer(new GenericJackson2JsonRedisSerializer())
    redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()) 

При вызове listUsersBy () сериализуется List<User>, но сериализатор не может его сериализовать, поскольку каждый элемент списка имеет определенный пользователем класс SensitiveString, с которым должно быть что-то не так. сериализатору.

Я только приблизительно знаю, где может быть проблема, но я не знаю точную причину и как с ней бороться. Кто-нибудь может дать подсказку или обходной путь?

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