通常,可以通过在application.properties文件中添加日期类型数据的格式和时区配置,可以实现全局时间格式化
#jackson相关配置
spring.jackson.date-format = yyyy-MM-dd HH:mm:ss
#时区必须要设置
spring.jackson.time-zone= GMT+8
#ALWAYS的意思是即时属性为null,仍然也会输出这个key
spring.jackson.default-property-inclusion=ALWAYS
这种方式,仅对webmvc起作用(失效的话是另一种情况,网友可自行搜索解决方案)
但是,有些情况下,会需要通过ObjectMapper的writeValueAsString直接进行对象的序列化。此时会发现以上的全局设置并不起作用,日期类型数据将序列化为时间戳。如果想格式化,则必须通过添加注解的方式:
@Data
public class GetSysDateResult {
@JsonProperty(value = "SysDate")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date sysDate;
}
这样显然不方便,也可能会造成系统中配置的混乱。
经过研究,我简单封装了一个工具类,可静态调用,且通过添加setXXX实现静态类支持@Value的方法实现对配置文件中设置的支持。同时,此方案不影响@JsonFormat设置。
希望对大家能有所帮助。
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
@Component
public final class JsonUtil {
private static ObjectMapper mapper = new ObjectMapper();
// 获取配置中的日期格式并设置
@Value("${spring.jackson.date-format}")
public void setPattern(String val) {
SimpleDateFormat df = new SimpleDateFormat(val);
mapper.setDateFormat(df);
}
// 获取配置中时区并设置
@Value("${spring.jackson.time-zone}")
public void setTimeZone(String val) {
TimeZone tz = TimeZone.getTimeZone(val);
mapper.setTimeZone(tz);
}
/**
* 序列号对象为json字符串
*/
public static String serialObject(Object object) throws JsonProcessingException {
return mapper.writeValueAsString(object);
}
/**
* 从json字符串反向序列化为对象
*/
public static <T> T deserialObject(String jsonStr, Class<T> valueType) throws JsonProcessingException {
return mapper.readValue(jsonStr, valueType);
}
/**
* 从json字符串反向序列化为对象
*/
public static <T> T deserializeObject(String jsonStr, TypeReference<T> valueType) throws JsonProcessingException {
return mapper.readValue(jsonStr, valueType);
}
}