我想在spring MVC中用jackson序列化一个对象。
我有一个控制器,它返回一个ObjectTest1,它有一个属性ObjectTest2。
public class ObjectTest1{
private ObjectTest2;
// setters getters...
}
public class ObjectTest2{
private String value;
// setters getters...
}
public @ResponseBody ObjectTest1 test() throws IOException ...
我有一个mapper,我有一个ObjectTest2的序列化器,我用@JsonSerialize(using = ObjectTest2.class)注释了ObjectTest1.getObjectTest2方法。
它正常工作! 但我想在很多Object中使用这个序列化程序,而不仅仅是在ObjectTest1中。
我应该怎么做才能避免在每个getter方法中添加注释?可以自动使用弹出此序列化程序的所有特性,即ObjectTest2?
更新:
我已经在我的代码中使用了这个:
<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作为属性的所有方法。 所以我的问题是,可以自动序列化每个类型为InnerThing的属性吗?
答案 0 :(得分:3)
默认情况下,如果您将Jackson添加到类路径并使用<mvc:annotation-driven>
或@EnableWebMvc
,则Spring会自动处理JSON的序列化和反序列化。
Spring参考文档的链接:
Spring 3.0:<mvc:annotation-driven>
春季3.1:<mvc:annotation-driven> and @EnableWebMvc
答案 1 :(得分:2)
您希望Jackson始终使用自定义JsonSerializer或JsonDeserializer来序列化/反序列化特定类型吗?
我最终编写了一个自定义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;
}
}