我有一个类如下:
@CompileStatic
@JsonSerialize(using = JsonSerializer)
@JsonDeserialize(using = JsonDeserializer)
class SensitiveString {
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))
}
}
}
然后我有一个类,里面用到这个SensitiveString
class User{
String name;
SensitiveString passed;
...
}
然后我用redis做mybatis二级缓存,json解析用的GenericJackson2JsonRedisSerializer
redisTemplate.setKeySerializer(new StringRedisSerializer())
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer())
redisTemplate.setHashKeySerializer(new GenericJackson2JsonRedisSerializer())
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer())
当mapper里有listUsers()方法时,mybatis需要把一个List<User>序列化加到二级缓存中去,序列化的时候出错,错误信息是
[Type id handling not implemented for type mypackage.SensitiveString (by serializer of type mypackage.SensitiveString$JsonSerializer) (through reference chain: java.util.ArrayList[0]->mypackage.User["passwd"])]
这种如何解决?
实体类实现Serializable