天天看點

自定義對象轉換器 @ResponseBody 裡json對象屬性轉換

當我們有需求需要将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);
    }
}