• Jackson全局日期格式化


    方式1:使用@JsonComponent方式(推荐)

     
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.core.JsonParser;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.DeserializationContext;
    import com.fasterxml.jackson.databind.JsonDeserializer;
    import com.fasterxml.jackson.databind.JsonSerializer;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.boot.jackson.JsonComponent;
     
    import java.io.IOException;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
     
    /**
     * Jackson全局日期格式化
     *
     * @author nijl
     * @date 2020/6/29
     */
    @Slf4j
    @JsonComponent
    public class DateFormatConfig {
     
        private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        private static final List<String> formarts = new ArrayList<>(4);
     
        static {
            formarts.add("yyyy-MM");
            formarts.add("yyyy-MM-dd");
            formarts.add("yyyy-MM-dd HH:mm");
            formarts.add("yyyy-MM-dd HH:mm:ss");
        }
     
        /**
         * 日期格式化
         * 会忽略实体类JsonFormat注解方式
         */
        public static class DateJsonSerializer extends JsonSerializer<Date> {
            @Override
            public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                jsonGenerator.writeString(dateFormat.format(date));
            }
        }
     
        /**
         * 解析日期字符串
         */
        public static class DateJsonDeserializer extends JsonDeserializer<Date> {
            @Override
            public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
                return convert(jsonParser.getText());
            }
        }
     
        public static Date convert(String source) {
            String value = source.trim();
            if ("".equals(value)) {
                return null;
            }
            if (source.matches("^\d{4}-\d{1,2}$")) {
                return parseDate(source, formarts.get(0));
            } else if (source.matches("^\d{4}-\d{1,2}-\d{1,2}$")) {
                return parseDate(source, formarts.get(1));
            } else if (source.matches("^\d{4}-\d{1,2}-\d{1,2} {1}\d{1,2}:\d{1,2}$")) {
                return parseDate(source, formarts.get(2));
            } else if (source.matches("^\d{4}-\d{1,2}-\d{1,2} {1}\d{1,2}:\d{1,2}:\d{1,2}$")) {
                return parseDate(source, formarts.get(3));
            } else {
                throw new IllegalArgumentException("Invalid date value '" + source + "'");
            }
        }
     
        /**
         * 格式化日期
         *
         * @param dateStr String 字符型日期
         * @param format  String 格式
         * @return Date 日期
         */
        public static Date parseDate(String dateStr, String format) {
            Date date = null;
            try {
                DateFormat dateFormat = new SimpleDateFormat(format);
                date = dateFormat.parse(dateStr);
            } catch (Exception e) {
                log.error("Error:parseDate(dateStr:{},format:{})", dateStr, format);
            }
            return date;
        }
     
    }
    View Code

    方式2:使用继承WebMvcConfigurationSupport方式

    import com.fasterxml.jackson.core.JsonParser;
    import com.fasterxml.jackson.databind.DeserializationContext;
    import com.fasterxml.jackson.databind.JsonDeserializer;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.module.SimpleModule;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.format.FormatterRegistry;
    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.WebMvcConfigurationSupport;
     
    import java.io.IOException;
    import java.util.Date;
    import java.util.List;
     
    /**
     * @author nijl
     * @date 2020/6/18
     */
     
    @Configuration
    public class WebMvcConfig extends WebMvcConfigurationSupport {
     
        @Autowired
        private DateConverterConfig dateConverterConfig;
     
        /**
         * 添加自定义的Converters和Formatters.
         */
        @Override
        protected void addFormatters(FormatterRegistry registry) {
            registry.addConverter(dateConverterConfig);
        }
     
        /**
         * 解决继承WebMvcConfigurationSupport
         *
         * @param converters
         */
        @Override
        protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            MappingJackson2HttpMessageConverter converter;
            converter = new MappingJackson2HttpMessageConverter();
            ObjectMapper objectMapper = new ObjectMapper();
            SimpleModule module = new SimpleModule();
            module.addDeserializer(Date.class, new JsonDeserializer<Date>() {
                @Override
                public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
                    return dateConverterConfig.convert(jsonParser.getText());
                }
            });
            objectMapper.registerModule(module);
            converter.setObjectMapper(objectMapper);
            converters.add(converter);
            super.configureMessageConverters(converters);
        }
     
        /**
         * 如果继承了WebMvcConfigurationSupport,则在yml中配置的相关内容会失效。 需要重新指定静态资源
         *
         * @param registry
         */
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/**")
                    .addResourceLocations("classpath:/static/")
                    .addResourceLocations("classpath:/resources/")
                    .addResourceLocations("classpath:/META-INF/resources/");
            super.addResourceHandlers(registry);
        }
    }
    
     
    import org.springframework.core.convert.converter.Converter;
    import org.springframework.stereotype.Component;
     
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
     
    /**
     * @author nijl
     * @date 2020/6/18
     */
    @Component
    public class DateConverterConfig implements Converter<String, Date> {
     
        private static final List<String> formarts = new ArrayList<>(4);
        static{
            formarts.add("yyyy-MM");
            formarts.add("yyyy-MM-dd");
            formarts.add("yyyy-MM-dd HH:mm");
            formarts.add("yyyy-MM-dd HH:mm:ss");
        }
     
        @Override
        public Date convert(String source) {
            String value = source.trim();
            if ("".equals(value)) {
                return null;
            }
            if(source.matches("^\d{4}-\d{1,2}$")){
                return parseDate(source, formarts.get(0));
            }else if(source.matches("^\d{4}-\d{1,2}-\d{1,2}$")){
                return parseDate(source, formarts.get(1));
            }else if(source.matches("^\d{4}-\d{1,2}-\d{1,2} {1}\d{1,2}:\d{1,2}$")){
                return parseDate(source, formarts.get(2));
            }else if(source.matches("^\d{4}-\d{1,2}-\d{1,2} {1}\d{1,2}:\d{1,2}:\d{1,2}$")){
                return parseDate(source, formarts.get(3));
            }else {
                throw new IllegalArgumentException("Invalid boolean value '" + source + "'");
            }
        }
     
        /**
         * 格式化日期
         * @param dateStr String 字符型日期
         * @param format String 格式
         * @return Date 日期
         */
        public  Date parseDate(String dateStr, String format) {
            Date date=null;
            try {
                DateFormat dateFormat = new SimpleDateFormat(format);
                date = dateFormat.parse(dateStr);
            } catch (Exception e) {
     
            }
            return date;
        }
     
    }
    View Code
  • 相关阅读:
    对REST的理解
    longest-repeating-character-replacement(难)
    reconstruct-original-digits-from-english(好)
    third-maximum-number
    【好】strong-password-checker,我自己做出来的:)
    arithmetic-slices
    [poj 3159]Candies[差分约束详解][朴素的考虑法]
    POJ 2773 Happy 2006
    MySql安装(rpm)和启动配置
    [51daifan]来吧,一起书写51daifan的成长史吧-让一部分人先安全起来
  • 原文地址:https://www.cnblogs.com/njl041x/p/13210307.html
Copyright © 2020-2023  润新知