我正在 Spring MVC 中开发一个 REST Web 服务。我需要更改 jackson 2 序列化 mongodb objectid 的方式。我不确定该怎么做,因为我找到了 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>
我的 CustomConverter 永远不会被调用。我认为 CustomObjectMapper 的定义是错误的,我从 jackson 1.x 的一些代码中改编了它
在我的 Controller 中,我使用的是@ResponseBody。 我在哪里做错了?谢谢
最佳答案
您应该使用 @JsonSerialize 注释相应的模型字段注释。在您的情况下,它可能是:
public class MyMongoModel{
@JsonSerialize(using=ObjectIdSerializer.class)
private ObjectId id;
}
但在我看来,最好不要使用实体模型作为 VO。更好的方法是在它们之间有不同的模型和映射。 您可以找到my example project here (我以 Spring 3 和 Jackson 2 为例使用日期序列化)。
关于java - Spring 3.2 和 jackson 2 : add custom object mapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14363555/