Java 将Jackson从2.0.4升级到2.7.1

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

我正在尝试升级我的项目以使用更新版本的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{

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();
}
}