我通常使用mixins在使用Jackson Library时执行自定义序列化和反序列化.Spring Boot应用程序中的My RestController具有类似于下面列出的方法.我猜Spring Boot使用Jackson将VerifyAccountResponse序列化为字符串.但是,当将我们的日历/日期对象转换为字符串时,它会将其转换为长值.我可以使用自定义序列化程序将它们转换为适当的格式.但是,我必须在序列化后将返回类型更改为对象.有没有办法保留相同的签名,并将自定义序列化程序添加到Spring Boot执行的默认序列化.
@RequestMapping(value ="verifyAccount", method = RequestMethod.POST, produces=MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<VerifyAccountResponse> verifyAccount(@RequestBody VerifyAccountRequest request) {
VerifyAccountResponse response = service.verifyAccount(request);
return new ResponseEntity<VerifyAccountResponse>(response, HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
Updated the below based on the answers , but mixin doesn't seem to take effect -
@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.mixIn(ConnectStatus.class, com.datacast.service.util.DateFormatSerializerMixin.class);
return builder;
}
Run Code Online (Sandbox Code Playgroud)
编辑2:
我创建了一个简单的弹簧启动项目来测试它,这很好.但是当我在我的大项目中使用这种方法时,日期转换不会发生.有没有什么可以覆盖Jackson2ObjectMapperBuilder?
我正在使用Jackson进行JSON序列化,并编写了一些自定义String序列化程序,一个用于类的每个getter方法.每个方法都返回相同的类型Set<String>,但每个方法使用不同的序列化程序.
不幸的是,杰克逊没有使用每个序列化器,每个方法一个,但是两个都使用一个序列化器.它似乎采用按字母顺序排列的任何方法,并将两种方法用于序列化程序.我期望的是第一种方法注释的序列化器用于第一种方法,第二种方法注释的序列化器用于第二种方法.调试似乎表明Jackson在地图中使用方法的返回类型键入了序列化程序(两者都相同).
一个例子:
public class FooBar {
private Set<String> foos = new HashSet<String>();
private Set<String> bars = new HashSet<String>();
@JsonProperty("FooWrapper")
@JsonSerialize(contentUsing = FooSerializer.class)
public Set<String> getFoos() {
return foos;
}
@JsonProperty("BarWrapper")
@JsonSerialize(contentUsing = BarSerializer.class)
public Set<String> getBars() {
return bars;
}
}
Run Code Online (Sandbox Code Playgroud)
有关如何getFoos()使用a 获取方法序列化的任何建议FooSerializer,以及getBars()使用BarSerializer?序列化的方法?在此示例中,BarSerializer将为两个方法调用.
请注意,如果我将其中一个方法的签名更改为另一个集合类型,以便它们不同 - List<String>例如 - 序列化可以工作.
提前致谢.