我想在springMVC中用jackson序列化一个对象。
我有一个控制器,它返回一个具有属性ObjectTest2的ObjectTest1。
public class ObjectTest1{
private ObjectTest2;
// setters getters...
}
public class ObjectTest2{
private String value;
// setters getters...
}
public @ResponseBody ObjectTest1 test() throws IOException ...
我有一个ObjectTest2的映射程序和序列化程序,我用@JsonSerialize(使用=ObjectTest2.class)注释了ObjectTest1.getObjectTest2方法。
它工作正常!但是我想在很多Object中使用这个序列化程序,而不仅仅是在ObjectTest1中。
我应该怎么做才能避免对每个getter方法进行注释?可以为ObjectTest2的所有属性自动使用spring这个序列化程序吗?
更新:
我已经在我的代码中使用了这个:
<mvc:annotation-driven>
在ajax响应中,对象正确生成为json。也许我应该试着用另一种方式解释。
所以。我有这些对象:
public class DTO{
private InnerThing innerThing;
@JsonSerialize(using=ThingSerializer.class)
public InnerThing getThing(){...}
}
public class InnerThing{
private String value;
}
生成的json看起来像:
{"innerThing":{"value":"something"}}
之后,当我编写了一个序列化程序时,json是:
{"innerThing":"something"}
这是可以的,但要获得json的第二个版本,我必须用@JsonSerialize注释DTO类中的getInnerThing方法。。。
我不想注释所有使用InnerThing作为属性的方法。所以我的问题是,spring能自动序列化每一个类型为InnerThing的属性吗?
默认情况下,如果将Jackson添加到类路径并使用<mvc:annotation-driven>
或@EnableWebMvc
,Spring将自动处理JSON的序列化和反序列化。
春季参考文档链接:
弹簧3.0:<mvc:注释驱动>
弹簧3.1:<mvc:注释驱动>和@EnableWebMvc
您希望Jackson始终使用您的自定义JsonSerializer或JsonDeserializer来序列化/反序列化特定类型吗?
最后,我编写了一个自定义的Jackson模块,让Jackson可以找到Spring bean的序列化程序和反序列化程序。我使用的是Spring 3.1.2和Jackson 2.0.6
简化版:
public class MyObjectMapper extends ObjectMapper {
@Autowired
public MyObjectMapper(ApplicationContext applicationContext) {
SpringComponentModule sm = new SpringComponentModule(applicationContext);
registerModule(sm);
}
}
模块:
public class SpringComponentModule extends Module {
private ApplicationContext applicationContext;
public SpringComponentModule(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@Override public String getModuleName() {
return "jackson-spring-component";
}
@Override public Version version() {
return SpringComponentModuleVersion.instance.version();
}
@Override
public void setupModule(SetupContext context) {
context.addSerializers(new SpringComponentSerializers(this.applicationContext));
context.addDeserializers(new SpringComponentDeserializers(this.applicationContext));
}
}
ComponentSerializer类:
public class SpringComponentSerializers extends Serializers.Base {
private ApplicationContext applicationContext;
public SpringComponentSerializers(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@Override
public JsonSerializer<?> findSerializer(SerializationConfig config, JavaType type, BeanDescription beanDesc) {
Class<?> raw = type.getRawClass();
Map<String,JsonSerializer> beanSet = applicationContext.getBeansOfType(JsonSerializer.class);
for(String beanName : beanSet.keySet()) {
JsonSerializer<?> serializer = beanSet.get(beanName);
if(serializer.handledType().isAssignableFrom(raw)) {
return serializer;
}
}
return null;
}
}