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

标签 java json spring serialization jackson

在 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"}}

如您所见,您可以在请求处理程序中使用带有 MixInObjectMapper,并且可以在 RestTemplate 中使用默认的 ObjectMapper

更新 1

Spring 创建默认的 ObjectMapper bean 并使用它来序列化和反序列化请求的数据。您必须找到并覆盖这个默认 bean。怎么做?请参阅以下链接:

这个重写的 bean 应该类似于上面示例中的 mapperWithMixIn

其次,您必须创建新的 ObjectMapper bean 并将该 bean 注入(inject)到所有 RestTemplate-s 中,并在这些类中使用该 bean 作为序列化器/反序列化器。

关于java - Spring 应用程序中用于 REST 和 Ajax 序列化的不同 JSON 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22691765/

相关文章:

从 Java 9 开始,javassist.NotFoundException

Java数据库连接

java - 在 fragment 之间滑动

json - Ember-auth QUnit 测试每运行一次就会失败

java - 为什么 AspectJ 在包作用域方法上的编织不起作用?

java - Apache Spark 和 Spring Boot 的依赖冲突

java - 使用 JSTL 在 JSP 中遍历 JSONArray

java - 如何让 JUnit 在抛出异常和执行无异常时都通过?

json - 使用 text2json 将 TSV 文件转换为 JSON 不返回任何值

android - android :Error parsing data org. json.JSONException: End of input at character 0 of input 中的 JSON Parse error