Spring MVC jackson自动序列化



我想在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;
}
}

最新更新