用于REST和Ajax序列化的Spring应用程序中的不同JSON配置

时间:2014-03-27 15:11:28

标签: java json spring serialization jackson

在Spring应用程序中,我添加了一个自定义JSON序列化程序,该序列化程序应用于带有thte标记的字段:

@JsonSerialize(using=MySerializer.class)

MySerializer序列化程序(whcihc从JsonSerializer扩展)有一个看起来像这样的方法:

@Override
public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException
{ 
    //some logic
}

当应用程序在使用@ResponseBody注释的方法中生成json时,它可以工作并执行逻辑,但是当应用程序使用带有JSON的Web服务时,它也会执行相同的逻辑。我想为RestTemplate序列化和@ResponseBody设置不同的配置,或者至少能够在序列化方法中区分我们是在@ResponseBody案例还是在RestTemplate案例中。

关于如何做到这一点的任何想法?

感谢。

1 个答案:

答案 0 :(得分:2)

您应该使用Mix-in Annotations功能。例如,您的POJO类可能如下所示:

class Root {

    private Data data;

    // getters/setters
}

class Data {

    private String name;

    // getters/setters
}

现在,您必须创建MixIn interface:

interface RootMixIn {

    @JsonSerialize(using = DataSerializer.class)
    Data getData();
}

想象一下,自定义序列化程序如下所示:

class DataSerializer extends JsonSerializer<Data> {

    @Override
    public void serialize(Data data, JsonGenerator generator, SerializerProvider provider) throws IOException, JsonProcessingException {
        generator.writeStartObject();
        generator.writeFieldName("name_property");
        generator.writeString(data.getName() + " XXX");
        generator.writeEndObject();
    }
}

最后,您必须创建两个ObjectMapper&#39}。简单用法:

Data data = new Data();
data.setName("Tom");

Root root = new Root();
root.setData(data);

ObjectMapper mapperWithMixIn = new ObjectMapper();
mapperWithMixIn.addMixInAnnotations(Root.class, RootMixIn.class);

ObjectMapper mapperDefault = new ObjectMapper();

System.out.println("With MIX-IN");
System.out.println(mapperWithMixIn.writeValueAsString(root));

System.out.println("Default");
System.out.println(mapperDefault.writeValueAsString(root));

以上脚本打印:

With MIX-IN
{"data":{"name_property":"Tom XXX"}}
Default
{"data":{"name":"Tom"}}

正如您所看到的,ObjectMapper MixIn可以在请求处理程序中使用ObjectMapper,默认Spring可以在RestTemplate中使用。

更新1

ObjectMapper创建默认的mapperWithMixIn bean,并使用它来序列化和反序列化请求的数据。您必须查找并覆盖此默认Bean。怎么做?请看下面的链接:

在我上面的例子中,这个被覆盖的bean应该看起来像ObjectMapper

其次,您必须创建新的{{1}} bean并将此bean注入所有RestTemplate-s并在这些类中将此bean用作序列化器/反序列化器。