在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案例中。
关于如何做到这一点的任何想法?
感谢。
答案 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中使用。
ObjectMapper
创建默认的mapperWithMixIn
bean,并使用它来序列化和反序列化请求的数据。您必须查找并覆盖此默认Bean。怎么做?请看下面的链接:
在我上面的例子中,这个被覆盖的bean应该看起来像ObjectMapper
。
其次,您必须创建新的{{1}} bean并将此bean注入所有RestTemplate-s并在这些类中将此bean用作序列化器/反序列化器。