jackson 将自定义序列化程序与ObjectMapper一起使用

mepcadol  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(159)

我在应用程序中需要两个Map器。一个Map所有DTO中的所有字段,另一个跳过包含一些PII的几个字段。
我创建了一个自定义序列化程序:

public class PIIMaskerSerializer extends StdSerializer {
    public PIIMaskerSerializer() {
        this(null);
    }

    public PIIMaskerSerializer(Class t) {
        super(t);
    }

    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeStartObject();
        try {
            for (final Field f : value.getClass().getFields()) {
                if (!f.isAnnotationPresent(PIIField.class)) {
                    gen.writeStringField(f.getName(), (String) f.get(value));
                }
            }
        } catch (final Exception e) {
            //
        }
        gen.writeEndObject();
    }
}```

在自定义模块中使用此序列化程序:

public PIIMaskerModule() {
        addSerializer(new PIIMaskerSerializer());
    }

然后用该模块创建一个对象Map器;
但是,我收到此错误:
类型为PIIMaskerSerializer的JsonSerializer未定义有效的handledType()--必须使用采用类型参数的方法注册,或使序列化程序扩展“com.fasterxml.jackson.databind.ser.std.StdSerializer”
此外,我并不是只为一种类型的对象创建自定义序列化程序,而是为任何/所有对象(如开箱即用的objectmapper)创建自定义序列化程序。
非常感谢你的帮助。

kxe2p93d

kxe2p93d1#

好的,我通过反复试验才弄明白的。SimpleModule有问题。
将构造函数从

public PIIMaskerModule() {
        addSerializer(new PIIMaskerSerializer());
    }

public PIIMaskerModule() {
        addSerializer(Object.class, new PIIMaskerSerializer());
    }

帮我修好了。

相关问题