Spring MVC杰克逊自动序列化?

时间:2012-09-17 18:36:32

标签: spring-mvc jackson

我想在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的属性吗?

2 个答案:

答案 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;
    }
}