springmvc默认采用MappingJackson2HttpMessageConverter将dto对象序列化为Json字符串,如果不加配置的话,返回的json数据中 时间格式可能不是很直观。笔者发现改变jackson的配置来实现这一需求。
方案一
配置文件中添加
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
方案二
如果想进一步对jackson进行配置(比如BigDecimal转化为String),可以使用这种方式。
/**
* 时间配置
* BigDecimal转String配置
* Null值处理
*/
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
//通过springmvc提供的配置接口
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
//配置jackson
converters.stream().filter(c -> c instanceof MappingJackson2HttpMessageConverter).forEach(cvt -> {
MappingJackson2HttpMessageConverter converter = (MappingJackson2HttpMessageConverter) cvt;
ObjectMapper objectMapper = converter.getObjectMapper();
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
objectMapper.setTimeZone(TimeZone.getDefault());
//处理null值
objectMapper.getSerializerProvider().setNullValueSerializer(NullValueJsonSerializer.instance);
//objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
//Include.Include.ALWAYS 默认
//Include.NON_DEFAULT 属性为默认值不序列化
//Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化
//Include.NON_NULL 属性为NULL 不序列化
SimpleModule module = new SimpleModule();
module.addSerializer(BigDecimal.class, BigDecimalToStringSerializer.instance);
objectMapper.registerModule(module);
});
}
public static class NullValueJsonSerializer extends JsonSerializer<Object> {
public static final NullValueJsonSerializer instance = new NullValueJsonSerializer();
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
String fieldName = jsonGenerator.getOutputContext().getCurrentName();
try {
Field field = jsonGenerator.getCurrentValue().getClass().getDeclaredField(fieldName);
if (Objects.equals(field.getType(), String.class)) {
//字符串型空值""
jsonGenerator.writeString("");
} else if (Objects.equals(field.getType(), Collection.class)) {
//列表型空值返回[]
jsonGenerator.writeStartArray();
jsonGenerator.writeEndArray();
} else if (Objects.equals(field.getType(), Map.class)) {
//map型空值返回{}
jsonGenerator.writeStartObject();
jsonGenerator.writeEndObject();
} else if (Objects.equals(field.getType(), Boolean.class)) {
//todo Boolean处理待定
jsonGenerator.writeBoolean(false);
} else {
jsonGenerator.writeString("");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static class BigDecimalToStringSerializer extends StdSerializer<BigDecimal> {
public static final BigDecimalToStringSerializer instance = new BigDecimalToStringSerializer();
public BigDecimalToStringSerializer() {
super(BigDecimal.class);
}
@Override
public boolean isEmpty(SerializerProvider prov, BigDecimal value) {
return value == null;
}
@Override
public void serialize(BigDecimal bigDecimal, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(bigDecimal.toPlainString());
}
}
}