spring mvc 设置responsebody时间序列化

问题:
使用spring boot 2.0 后, 较新的spring mvc HttpMessageConverters 如果存在jackson 库时,则默认使用自动配置的Jackson2ObjectMapperBuilder生成的转换器对消息进行转化。 序列化的结果可能并不是我们期望的,这时我们需要通过设置。 spring的官方文档地址: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper

例如下代码:

@PostMapping(value = "/sql/{env}/{service}")
@ResponseBody
public ResponseEntity sql(@PathVariable("env") String env, @PathVariable("service") String service,
@RequestBody SqlRequestVo sqlRequestVo) {

log.info(sqlRequestVo.getEnv());
log.info(env);
log.info(sqlRequestVo.toString());

SqlResponseVo sqlResponseVo = sqlServiceImpl.runSql(env, service, sqlRequestVo.getSql());
return new ResponseEntity<>(sqlResponseVo, HttpStatus.OK);

}

return 的对象,会自动被springmvc 将java object 序列化成json或者xml 返回给http client客户端。(序列化城json还是xml,取决于客户端请求的accept参数值) 序列化的规则,是spring mvc 默认的序列化方式,如果我们需要改变默认的序列化方式时,则需要针对序列化的特性特定进行配置。


@Data
public class SqlResponseVo {

String status;
int count;
String message;
JSONArray data;

public SqlResponseVo() {

status = "";
count = 0;
message = "";

}

public SqlResponseVo(String status, String message, JSONArray data) {

this.status = status;
this.count = 0;
this.message = message;
this.data = data;
}

}

例如: sqlResponseVo中的jsonarray中包含了sql date类型,例如 [{“date”:时间值}], 那么返回给客户端的json 则date会直接转化为 格式化的时间格式 “2019-06-25T00:10:10 000Zxxx” 。 如果我们想返回时间戳(java时间秒的话),则需要针对Jackson2ObjectMapperBuilder 自动生成的消息转换器进行参数配置。

我们只需要在spring boot 的application.properties 中添加如下配置即可。

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=true
#(默认是false)

如果仅仅通过修改配置无法达到我们的期望时,我们就需要进行开发自定义的http message converter了。

此篇文章已被阅读1498 次

Add a Comment

邮箱地址不会被公开。 必填项已用*标注