【发布时间】:2017-12-19 08:26:46
【问题描述】:
我有 2 个控制器和一个用于自定义序列化字段的 get 方法,例如 @JsonSerialize(using = MySerialization.class)。
但是我想在我从 A 控制器而不是 B 控制器调用方法时进行这种序列化。
如何指定?
【问题讨论】:
我有 2 个控制器和一个用于自定义序列化字段的 get 方法,例如 @JsonSerialize(using = MySerialization.class)。
但是我想在我从 A 控制器而不是 B 控制器调用方法时进行这种序列化。
如何指定?
【问题讨论】:
好的,我假设你有以下请求地图
@RequestMapping(value = "/saveA", method = RequestMethod.GET)
public @ResponseBody Person getPersonA() {
return getPerson();
}
@RequestMapping(value = "/saveB", method = RequestMethod.GET)
public @ResponseBody Person getPersonB() {
return getPerson();
}
private Person getPerson() {
return new Person("Elvis");
}
static class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
所以你想在每个 requestMap 上以不同的方式序列化 Person 对象,我个人找不到(甚至看到)Spring 解决方案,我认为这是杰克逊和 Java 的问题解决了,所以这是我的解决方案:
创建一个 Person 子类,然后根据需要自定义它,例如
static class CustomPerson extends Person {
public CustomPerson(String name) {
super(name);
}
@JsonSerialize(using = NameSerializer.class)
@Override
public String getName() {
return super.getName();
}
}
static class NameSerializer extends JsonSerializer {
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString("customSerializer-" + String.valueOf(value));
}
}
然后,您需要做的就是创建一个映射器方法,将您的 Person 转换为 CustomPerson
@RequestMapping(value = "/saveB", method = RequestMethod.GET)
public @ResponseBody Person getPersonB() {
return getCustomPerson();
}
private Person getCustomPerson() {
return new CustomPerson(getPerson().getName());
}
另一种选择是创建对象映射器并在需要自定义对象时根据需要序列化对象:
@RequestMapping(value = "/saveC", method = RequestMethod.GET)
public void getPersonC(HttpServletResponse response) throws IOException {
response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
new ObjectMapper()
.registerModule(new SimpleModule().addSerializer(Person.class, new JsonSerializer<Person>() {
@Override
public void serialize(Person value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
gen.writeStringField("name", "Custom-" + value.getName());
gen.writeEndObject();
}
}))
.writeValue(response.getWriter(), getPerson());
}
【讨论】: