當我們有需求需要将Controller傳回值類型統一進行資料類型轉換時,spring提供了很好的重寫方法,如下将DateTime這個對象轉換為long行毫秒數傳回給用戶端。
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JacksonStdImpl;
import com.fasterxml.jackson.databind.ser.std.DateTimeSerializerBase;
import org.joda.time.DateTime;
import java.io.IOException;
import java.text.DateFormat;
@JacksonStdImpl
public class DateTimeSerializer extends DateTimeSerializerBase<DateTime> {
public final static DateTimeSerializer instance = new DateTimeSerializer(DateTime.class,false,null);
private DateTimeSerializer(Class<DateTime> type, Boolean useTimestamp, DateFormat customFormat) {
super(type, useTimestamp, customFormat);
}
@Override
public DateTimeSerializerBase<DateTime> withFormat(Boolean timestamp, DateFormat customFormat) {
return null;
}
@Override
protected long _timestamp(DateTime value) {
return (value == null) ? 0L : value.toDate().getTime();
}
@Override
public void serialize(DateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeNumber(_timestamp(value));
}
}
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import org.joda.time.DateTime; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import java.util.List;
@Configuration
public class DateTimeConfig extends WebMvcConfigurerAdapter {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = jackson2HttpMessageConverter.getObjectMapper();
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(DateTime.class, DateTimeSerializer.instance);
objectMapper.registerModule(simpleModule);
jackson2HttpMessageConverter.setObjectMapper(objectMapper);
//放到第一個
converters.add(0, jackson2HttpMessageConverter);
}
}