0

Springboot 上有没有一种方法可以在我的请求中为特定字段实现自定义序列化程序而无需进行注释?

如果我们可以创建一个 bean 或覆盖一个配置并序列化一个字符串输入(来自 json 请求),我更喜欢我的请求 pojo 上的 OffsetDateTime 字段。

我无法注释,因为我的请求类是自动生成的..

4

1 回答 1

0

您可以在 jackson 中以编程方式注册序列化程序。需要自定义序列化的类:

public class SpecialObject {

    private String field;
    private String anotherField;

    //getters, setters
}

包装类,它是一个字段:

public class WrapperObject {

    private String text;
    private SpecialObject specialObject;

    //getters, setters
}

序列化器:

public class SpecialObjectSerializer extends StdSerializer<SpecialObject> {

    public SpecialObjectSerializer() {
        super(SpecialObject.class);
    }

    @Override
    public void serialize(SpecialObject value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeStartObject();
        gen.writeStringField("fieldChanged", value.getField());
        gen.writeStringField("anotherFieldChanged", value.getAnotherField());
        gen.writeEndObject();
    }
}

没什么特别的,只是在序列化时更改字段名称。

现在您需要在 a 中添加您的序列化Module程序并在对象映射器中注册该模块。你可以这样做:

public class NoAnnot {

    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        //add serializer in module
        module.addSerializer(SpecialObject.class, new SpecialObjectSerializer());
        //register module
        objectMapper.registerModule(module);
        objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
        
        SpecialObject specialObject = new SpecialObject();
        specialObject.setField("foo");
        specialObject.setAnotherField("bar");
        WrapperObject wrapperObject = new WrapperObject();
        wrapperObject.setText("bla");
        wrapperObject.setSpecialObject(specialObject);
        String json = objectMapper.writeValueAsString(wrapperObject);
        System.out.println(json);
    }
}
于 2022-01-25T09:29:28.253 回答