Java 将Jackson从2.0.4升级到2.7.1
我正在尝试升级我的项目以使用更新版本的Jackson,但遇到了自定义序列化程序和反序列化程序的障碍 在下面的反序列化程序中,我遇到了一个构造函数问题-我不确定应该传递什么类型。我正在使用的构造函数不再可用。以下是当前课程: 导入com.fasterxml.jackson.databind.DeserializationContext; 导入com.fasterxml.jackson.databind.JsonNode; 导入com.fasterxml.jackson.databind.ObjectMapper; 导入com.fasterxml.jackson.databind.desr.std.StdKeyDeserializer 公共类SifMapKeyDeserializer扩展了StdKeyDeserializer{Java 将Jackson从2.0.4升级到2.7.1,java,jackson,Java,Jackson,我正在尝试升级我的项目以使用更新版本的Jackson,但遇到了自定义序列化程序和反序列化程序的障碍 在下面的反序列化程序中,我遇到了一个构造函数问题-我不确定应该传递什么类型。我正在使用的构造函数不再可用。以下是当前课程: 导入com.fasterxml.jackson.databind.DeserializationContext; 导入com.fasterxml.jackson.databind.JsonNode; 导入com.fasterxml.jackson.databind.Objec
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;
}
受保护的SifMapKeyDeserializer(类cls){
super(cls);//它抱怨。它需要一个类型,不确定是什么类型?
}
@凌驾
受保护对象\u解析(字符串键,反序列化上下文ctxt)
抛出异常{
ObjectMapper jacksonMapper=ObjectMapperFactory.getObjectMapper();
JsonNode元素=jacksonMapper.readTree(键);
String fullClassName=element.path(JacksonExtConstants.JAVA_CLASS_NAME_KEY).asText();
字符串nodeText=element.toString();
对象结果=空;
试一试{
结果=jacksonapper.readValue(nodeText,Class.forName(fullClassName));
}catch(classnotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回结果;
}
}
编辑我发现这可以解决上述问题
public SifMapKeyDeserializer(Class<?> cls) {
super(StdKeyDeserializer.TYPE_CLASS, cls);
}
公共SIFMAppKeyDeserializer(类cls){
超级(StdKeyDeserializer.TYPE_类,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();
}
}
import java.lang.reflect.Method;
导入java.util.List;
导入com.fasterxml.jackson.databind.BeanDescription;
导入com.fasterxml.jackson.databind.SerializationConfig;
导入com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
导入com.fasterxml.jackson.databind.introspect.AnnotationMap;
导入com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition;
导入com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
导入com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
导入com.fasterxml.jackson.databind.type.SimpleType;
导入com.fasterxml.jackson.databind.util.SimpleBeanPropertyDefinition;
/**
*这个自定义bean序列化程序允许我们添加/删除任何属性。
*例如,对于每个反序列化的bean,我们目前正在添加其完整的
*限定类名。
*
*/
公共类SifBeanSerializerModifier扩展了BeanSerializerModifier{
公共列表changeProperties(SerializationConfig配置,
Bean描述Bean描述,列出Bean属性){
类cc=beanDesc.getType().getRawClass();
方法m;
试一试{
m=cc.getMethod(“getClass”,null);
AnnotatedMethod am=新的AnnotatedMethod(m,_emptyAnnotationMap(),null);
BeanPropertyDefinition propDef=新的SimpleBeanPropertyDefinition(am,JacksonExtConstants.JAVA\u CLASS\u NAME\u KEY);
BeanPropertyWriter beanPropWriter=新的BeanPropertyWriter(propDef,
am,null,
SimpleType.constructUnsafe(Class.Class),
null,null,SimpleType.constructUnsafe(Class.Class),
真,空);
添加(beanPropWriter);
}捕获(安全异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(无此方法例外){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回Bean属性;
}
私有注释映射_emptyAnnotationMap(){
返回新的AnnotationMap();
}
}
任何帮助都将不胜感激
谢谢我可以这样修复它:
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);
TypeResolutionContext.Basic tb = new TypeResolutionContext.Basic(TypeFactory.defaultInstance(), TypeBindings.emptyBindings());
AnnotatedMethod am = new AnnotatedMethod(tb, m, _emptyAnnotationMap(), null);
BeanPropertyDefinition propDef = SimpleBeanPropertyDefinition.construct(config, 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();
}
公共类SifBeanSerializerModifier扩展了BeanSerializerModifier{
公共列表changeProperties(SerializationConfig配置,
Bean描述Bean描述,列出Bean属性){
类cc=beanDesc.getType().getRawClass();
方法m;
试一试{
m=cc.getMethod(“getClass”,null);
TypeResolutionContext.Basic tb=新的TypeResolutionContext.Basic(TypeFactory.defaultInstance(),TypeBindings.emptyBindings());
AnnotatedMethod am=新的AnnotatedMethod(tb,m,_emptyAnnotationMap(),null);
BeanPropertyDefinition propDef=SimpleBeanPropertyDefinition.construct(配置、am、JacksonExtConstants.JAVA\u类\u名称\u键);
BeanPropertyWriter beanPropWriter=新的BeanPropertyWriter(propDef,
am,null,
SimpleType.constructUnsafe(Class.Class),
null,null,SimpleType.constructUnsafe(Class.Class),
真,空);
添加(beanPropWriter);
}捕获(安全异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(无此方法例外){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回Bean属性;
}
私有注释映射_emptyAnnotationMap(){
返回新的AnnotationMap();
}
}