我正在尝试升级我的项目以使用更新版本的Jackson,并遇到了使用自定义串行器和反序列化器的障碍。将Jackson从2.0.4升级到2.7.1
关于下面的解串器我得到一个构造函数问题 - 我不知道我应该传入什么类型。我使用的构造函数不再可用。以下是当前班级:
import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.deser.std.StdKeyDeserializer;
公共类SifMapKeyDeserializer扩展StdKeyDeserializer {
protected SifMapKeyDeserializer(Class<?> cls) {
super(cls); //IT COMPLAINS. It needs a type, not sure what type?
}
@Override
protected Object _parse(String key, DeserializationContext ctxt)
throws Exception {
ObjectMapper jacksonMapper = ObjectMapperFactory.getObjectMapper();
JsonNode element = jacksonMapper.readTree(key);
String fullClassName = element.path(JacksonExtConstants.JAVA_CLASS_NAME_KEY).asText();
String nodeText = element.toString();
Object result = null;
try {
result = jacksonMapper.readValue(nodeText, Class.forName(fullClassName));
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
}
编辑我发现这个解决上述问题。
public SifMapKeyDeserializer(Class<?> cls) {
super(StdKeyDeserializer.TYPE_CLASS, cls);
}
解串器列在下面。我遇到了注释方法和SimpleBeanPropertyDefinition的问题 - 我不确定如何解决这些问题。
import java.lang.reflect.Method;
import java.util.List;
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
import com.fasterxml.jackson.databind.introspect.AnnotationMap;
import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
import com.fasterxml.jackson.databind.type.SimpleType;
import com.fasterxml.jackson.databind.util.SimpleBeanPropertyDefinition;
/**
* This custom bean serializer is to allow us add/delete any properties.
* For example for each deserialized bean we are currently adding its fully
* qualified class name.
*
*/
public class SifBeanSerializerModifier extends BeanSerializerModifier {
public List<BeanPropertyWriter> changeProperties(SerializationConfig config,
BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) {
Class cc = beanDesc.getType().getRawClass();
Method m;
try {
m = cc.getMethod("getClass", null);
AnnotatedMethod am = new AnnotatedMethod(m, _emptyAnnotationMap(), null);
BeanPropertyDefinition propDef = new SimpleBeanPropertyDefinition(am, JacksonExtConstants.JAVA_CLASS_NAME_KEY);
BeanPropertyWriter beanPropWriter = new BeanPropertyWriter(propDef,
am, null,
SimpleType.constructUnsafe(Class.class),
null, null, SimpleType.constructUnsafe(Class.class),
true, null);
beanProperties.add(beanPropWriter);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return beanProperties;
}
private AnnotationMap _emptyAnnotationMap() {
return new AnnotationMap();
}
}
任何帮助将不胜感激。
感谢