Spring 3.2 和 Jackson 2:添加自定义对象映射器

2022-09-04 04:44:15

我正在春季MVC中开发一个REST Webservice。我需要改变jackson 2如何序列化mongodb objectids。我不确定该怎么办,因为我找到了jackson 2的部分文档,我所做的是创建自定义序列化程序:

public class ObjectIdSerializer extends JsonSerializer<ObjectId> {


    @Override
    public void serialize(ObjectId value, JsonGenerator jsonGen,
            SerializerProvider provider) throws IOException,
            JsonProcessingException {
        jsonGen.writeString(value.toString());
    }
}

创建对象映射器

public class CustomObjectMapper extends ObjectMapper {

    public CustomObjectMapper() {
        SimpleModule module = new SimpleModule("ObjectIdmodule");
        module.addSerializer(ObjectId.class, new ObjectIdSerializer());
        this.registerModule(module);
    }

}

,然后注册映射器

<mvc:annotation-driven>
    <mvc:message-converters register-defaults="true">
        <bean
            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean class="my.package.CustomObjectMapper"></bean>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

我的自定义转换器从不被调用。我认为CustomObjectMapper的定义是错误的,我从jackson 1.x的一些代码中改编了它

在我的控制器中,我使用@ResponseBody。我哪里做错了?谢谢


答案 1

您应该使用@JsonSerialize的命名来批注相应的模型字段。在您的情况下,它可能是:

public class MyMongoModel{
   @JsonSerialize(using=ObjectIdSerializer.class)
   private ObjectId id;
}

但在我看来,最好不要使用实体模型作为VO。更好的方法是在它们之间有不同的模型和映射。你可以在这里找到我的示例项目(我使用Spring 3和Jackson 2作为示例的日期序列化)。


答案 2

我该怎么做是:

创建注释以声明自定义序列化程序:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyMessageConverter{
}

在 mvc 配置文件中为此设置组件扫描

<context:include-filter expression="package.package.MyMessageConverter"
            type="annotation" />

并创建一个实现 的类。HttpMessageConverter<T>

@MyMessageConverter
public MyConverter implements HttpMessageConverter<T>{
//do everything that's required for conversion.
}

创建一个类,该类 .extends AnnotationMethodHandlerAdapter implements InitializingBean

    public MyAnnotationHandler extends AnnotationMethodHandlerAdapter implements InitializingBean{
    //Do the stuffs you need to configure the converters
    //Scan for your beans that have your specific annotation
    //get the list of already registered message converters
    //I think the list may be immutable. So, create a new list, including all of the currently configured message converters and add your own. 
    //Then, set the list back into the "setMessageConverters" method.
    }

我相信这是你的目标所需要的一切。

干杯。