Java原生Enum太难用,对Enum进行扩展,添加了value属性,name属性;在用Jackson进行反序列化的时候遇到转换问题,简单的做法就是创建扩展枚举类转换器,在需要进行转换的属性上添加@JsonDeserialize注解。 这种做法有两个痛点:
1.针对每个扩展的枚举类,都需要制定一个转换器。
2.每个需要转换的枚举属性上都需要添加注解;
是否可以创建一个通用的扩展枚举类转换器,处理所有的枚举类呢。这里遇到本文难点,如何获取属性的类对象。很自然的想从DeserializationContext中获取,如下:
public abstract class DeserializationContext extends DatabindContext implements Serializable {
...
protected LinkedNode<JavaType> _currentType;
...
public JavaType getContextualType() {
return this._currentType == null ? null : (JavaType)this._currentType.value();
}
一开始尝试ctx.getContextualType().getRawClass()获取,但调用该方法一定会NullPointException;跟踪jackson源码后发现,发现ctx构造函数里里压根就不会初始化_currentType字段;不初始化放这里干嘛,一定别的用途,在DeserializationContext 发现有如下两个函数会给_currentType赋值。