在 Spring 应用程序中,我添加了一个自定义 JSON 序列化器,该序列化器应用于带有标签的字段:
@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 情况。
知道如何做到这一点吗?
谢谢。
最佳答案
您应该使用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
。简单用法:
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"}}
如您所见,您可以在请求处理程序中使用带有 MixIn
的 ObjectMapper
,并且可以在 RestTemplate 中使用默认的 ObjectMapper
。
更新 1
Spring
创建默认的 ObjectMapper
bean 并使用它来序列化和反序列化请求的数据。您必须找到并覆盖这个默认 bean。怎么做?请参阅以下链接:
- Spring, Jackson and Customization (e.g. CustomDeserializer) .
- How to customise the Jackson JSON mapper in Spring Web MVC .
这个重写的 bean 应该类似于上面示例中的 mapperWithMixIn
。
其次,您必须创建新的 ObjectMapper
bean 并将该 bean 注入(inject)到所有 RestTemplate-s 中,并在这些类中使用该 bean 作为序列化器/反序列化器。
关于java - Spring 应用程序中用于 REST 和 Ajax 序列化的不同 JSON 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22691765/