У меня есть определенный пользователем класс, как показано ниже (код 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, с которым должно быть что-то не так. сериализатору.
Я только приблизительно знаю, где может быть проблема, но я не знаю точную причину и как с ней бороться. Кто-нибудь может дать подсказку или обходной путь?