精华内容
下载资源
问答
  • 主要介绍了Spring Boot LocalDateTime格式化处理的示例详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • spring boot 日期格式化

    千次阅读 2018-08-09 20:38:44
    @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”) //格式化前台日期参数注解 private Date createTime; 但是我的是@JsonFormat 起作用了, @DatetimeFormat没有起作用(spring boot 2.0.3)具体原因...

    1、概述
    在返回的响应实体类和请求参数实体类中, 存在date 类型的字段如果处理转化, 下面进行讲解一下。

    2、实战
    方式一:

    @JSONField(format = “yyyy-MM-dd HH:mm:ss”) //FastJson包使用注解
    @JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”,timezone = “GMT+8”) //Jackson包使用注解
    @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”) //格式化前台日期参数注解
    private Date createTime;

    但是我的是@JsonFormat 起作用了, @DatetimeFormat没有起作用(spring boot 2.0.3)具体原因不知, 知道的可以给我留言。

    1) @DatetimeFormat(pattern=”yyyy-MM-dd HH:mm:ss”)
    是将String转换成Date,一般前台给后台传值时用
    2) @JsonFormat(pattern=”yyyy-MM-dd HH:mm:ss”)
    将Date转换成String 一般后台传值给前台时

    方法二:
    定义类:

    public class CustomJsonDateDeserializer extends JsonDeserializer<Date> {
    
        @Override
        public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    String date = jp.getText();
                    try {
                        return format.parse(date);
                    } catch (ParseException e) {
                        throw new RuntimeException(e);
                    }
        }
     }

    使用类注解:
    且在字段的setter上加上注解
    @JsonDeserialize(using = CustomJsonDateDeserializer.class)

    展开全文
  • Spring Boot格式化JSON日期 前言 今天博主将为大家分享SpringBoot(小笔记):Spring Boot格式化JSON日期,不喜勿喷,如有异议欢迎讨论! 概述 在本教程中,我们将展示如何在Spring Boot应用程序中格式化JSON...

    Spring Boot中格式化JSON日期


    前言

    今天博主将为大家分享SpringBoot(小笔记):Spring Boot中格式化JSON日期,不喜勿喷,如有异议欢迎讨论!


    概述

    在本教程中,我们将展示如何在Spring Boot应用程序中格式化JSON日期字段。 我们将探讨使用Jackson格式化日期的各种方法,它被Spring Boot用作默认的JSON处理器。


    在日期字段上使用@JsonFormat

    设置格式

    我们可以使用 @JsonFormat注释来格式化特定字段:

    public class Cntact{// other fields
    		@JsonFormat(pattern = "yyyy-MM-dd")
    		private LocalDate birthday;
    		@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    		private LocalDateTime lastUpdate;
    	}
    

    在生日字段上,我们使用的格式只显示日期,而在 lastUpdate字段中我们也包含时间。 我们使用了Java 8日期类型,它们非常便于处理时态类型。当然,如果我们需要使用像java.util.Date 这样的遗留类型 ,我们可以以相同的方式使用注释:

    public class ContactWithJavaUtilDate{
    		// other fields
    		@JsonFormat(pattern = "yyyy-MM-dd")
    		private	Date birthday;
    		@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    		private Date lastUpdate;
    		// standard getters and setters
    	}
    

    最后,让我们看看使用给定日期格式的@JsonFormat 呈现的输出 :

    { 
    "birthday": "2019-02-03",
    "lastUpdate":"2019-02-03 10:08:02"
    }
    

    我们可以看到,使用@JsonFormat 注释是格式化特定日期字段的绝佳方法。 但是,我们只应在需要字段的特定格式时使用它。如果我们想要在我们的应用程序中使用所有日期的通用格式,那么如何实现这一目标的方式更好,我们稍后会看到。

    设置时区

    另外,如果我们需要使用特定的时区,我们可以设置@JsonFormat的timezone属性:

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="Europe/Zagreb")
    private LocalDateTime lastUpdate;
    

    如果类型已包含时区,则不需要使用它,例如使用 java.time.ZonedDatetime.

    配置默认格式

    配置默认格式

    虽然@JsonFormat本身很强大,但对格式和时区进行硬编码可能会让我们陷入困境。 如果我们要为应用程序中的所有日期配置默认格式,则更灵活的方法是在application.properties中配置它:

    spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
    

    如果我们想在JSON日期中使用特定时区,那么还有一个属性:

    spring.jackson.time-zone=Europe/Zagreb
    

    尽管设置这样的默认格式非常方便直接,但这种方法存在缺陷。不幸的是,它不适用于Java 8日期类型,如 LocalDate 和 LocalDateTime - 我们只能使用它来格式化java.util.Date或 java.util.Calendar类型的字段 。 但是,我们很快就会看到希望。


    自定义Jackson的ObjectMapper

    因此,如果我们想使用Java 8日期类型 并 设置默认日期格式,那么我们需要查看创建一个 Jackson2ObjectMapperBuilderCustomizer bean:

    @Configuration
    	public class ContactAppConfig{
    		private	static final
    
    		String dateFormat = "yyyy-MM-dd";
    
    		private	static final
    
    		String dateTimeFormat = "yyyy-MM-dd HH:mm:ss";
    
    		@Bean
    		public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer(){
    
    			return builder ->{
    				builder.simpleDateFormat(dateTimeFormat);
    				builder.serializers(new
    
    				LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
    				builder.serializers(new
    
    				LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
    			};
    
    		}
    
    	}
    

    上面的示例显示了如何在我们的应用程序中配置默认格式。我们必须定义一个bean并覆盖其自定义方法以设置所需的格式。 虽然这种方法可能看起来有点麻烦,但它的优点在于它适用于Java 8和遗留日期类型。


    到这里SpringBoot(小笔记):Spring Boot中格式化JSON日期,分享完毕了,快去试试吧!


    最后

    • 更多参考精彩博文请看这里:《陈永佳的博客》

    • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!


    展开全文
  • Spring Boot日志格式化JSON方案

    千次阅读 2019-10-22 22:02:17
    在工作中需要对Spring Boot日志进行JSON格式化,主要是为了传递给ELK做日志收集平台分析。 考虑了以下几种方案: 自定义Converter实现 重新覆写Appender和Layout类,自定义实现 使用logstash-logback-encoder来实现...

    在工作中需要对Spring Boot日志进行JSON格式化,主要是为了传递给ELK做日志收集平台分析。

    考虑了以下几种方案:

    1. 自定义Converter实现
    2. 重新覆写Appender和Layout类,自定义实现
    3. 使用logstash-logback-encoder来实现

    最后使用logstash-logback-encoder来实现,今后也方便扩展,在这里总结一下。

    在Spring Boot的项目中,主要是使用了LogBack,这里简单介绍一下LogBack,Logback继承自log4j。

    Logback的架构非常的通用,适用不同的使用场景。Logback 被分成三个不同的模块:logback-core,logback-classic,logback-access。

    logback-core 是其它两个模块的基础。logback-classic 模块可以看作是 log4j 的一个优化版本,它天然的支持 SLF4J,所以你可以随意的从其它日志框架(例如:log4j 或者 java.util.logging)切回到 logack。

    logback-access 可以与 Servlet 容器进行整合,例如:Tomcat、Jetty。它提供了 http 访问日志的功能。

    在Spring Boot中默认内部集成了LogBack日志依赖,而Spring Boot默认使用了LogBack记录日志信息。所以我们可以直接就进行使用。

    一、自定义Converter实现

    主要是继承ch.qos.logback.classic.pattern.ClassicConverter这个类,然后覆写convert方法实现逻辑。我们知道在logback中包含level,msg这些变量,使用Coverter我们便可以定义自己的变量,然后再在convert方法里面进行Json处理。比如这里我们新建类JsonLogConverter,如下:

    package net.anumbrella.spring.log.config;
    
    import ch.qos.logback.classic.pattern.ClassicConverter;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import org.json.JSONObject;
    
    /**
     * @auther anumbrella
     */
    
    public class JsonLogConverter extends ClassicConverter {
    
        private JSONObject object = new JSONObject();
    
        @Override
        public String convert(ILoggingEvent iLoggingEvent) {
            object.put("msg",iLoggingEvent.getMessage());
            object.put("level", iLoggingEvent.getLevel().levelStr);
            object.put("threadName", iLoggingEvent.getThreadName());
            object.put("method", iLoggingEvent.getLoggerName());
            return object.toString();
        }
    }
    
    

    然后再在Resources下面添加logback-converter.xml文件,通过application.properties 配置logging.config=classpath:logback-converter.xml指定logback的路径,然后logback会继续寻找名为logback-converter.xml的文件并读取相关配置。

    这里我们还需要添加

     <conversionRule conversionWord="customJson" converterClass="net.anumbrella.spring.log.config.JsonLogConverter" />
    

    这个便是自定转换规则,conversionWord为自定义变量,而converterClass为自定义转换规则。具体logback.xml配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true" scanPeriod="30 seconds" packagingData="true">
    
        <conversionRule conversionWord="customJson"
                        converterClass="net.anumbrella.spring.log.config.JsonLogConverter" />
    
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%customJson%n</pattern>
            </encoder>
        </appender>
    
        <root level="debug">
            <appender-ref ref="STDOUT" />
        </root>
    </configuration>
    
    

    启动后我们可以在控制台看到具体的JSON日志,如下:

    converter

    这种方式需要所有变量都要进行处理,同时灵活性也较差。

    二、重新覆写Layout类,自定义实现

    通过自定义Layout类来实现json输出,主要是继承ch.qos.logback.core.LayoutBase这个类,然后覆写doLayout方法。比如这里我们新建类JsonLogLayout,如下:

    package net.anumbrella.spring.log.config;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.LayoutBase;
    
    /**
     * @auther anumbrella
     */
    
    public class JsonLogLayout extends LayoutBase<ILoggingEvent> {
    
        @Override
        public String doLayout(ILoggingEvent event) {
            StringBuilder result = new StringBuilder();
            if (null != event) {
                result.append("{");
    
                result.append("\"time\":\"");
                result.append(System.currentTimeMillis());
                result.append("\",");
    
                result.append("\"level\":\"");
                result.append(event.getLevel());
                result.append("\",");
    
                result.append("\"threadName\":\"");
                result.append(event.getThreadName());
                result.append("\",");
    
                result.append("\"msg\":\"");
                result.append(event.getFormattedMessage().replace("\"", "\\\""));
                result.append("\",");
    
                result.append("\"method\":\"");
                result.append(event.getLoggerName());
                result.append("\"} \n");
            }
            return result.toString();
        }
    }
    
    

    同理我们新建logback-layout.xml文件,然后在application.properties更改指定配置。然后还需要在logback-layout.xml中配置自定义的layout,并添加在encoder里。

       <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
           <layout class="net.anumbrella.spring.log.config.JsonLogLayout" />
       </encoder>
    

    具体XML如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true" scanPeriod="30 seconds" packagingData="true">
    
    
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
                <layout class="net.anumbrella.spring.log.config.JsonLogLayout" />
            </encoder>
        </appender>
    
        <root level="debug">
            <appender-ref ref="STDOUT" />
        </root>
    </configuration>
    

    启动应用后,我们发现一样能实现相同功能。

    这种方式和前面类似,所有变量都要进行处理,同时灵活性也较差。

    三、使用logstash-logback-encoder来实现

    logstash-logback-encoder作为第三方类库来使用,功能性和扩展性都比较好,github开发者也很活跃,地址

    而且考虑到日志系统主要对接elasticsearch系统,通过logstash提供的类库来实现也是一种不错的解决方案。首先我们在pom.xml中引入类库logstash-logback-encoder

         <dependency>
             <groupId>net.logstash.logback</groupId>
             <artifactId>logstash-logback-encoder</artifactId>
             <version>6.2</version>
         </dependency>
    

    然后在logback-logstash.xml中添加:

        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <jsonGeneratorDecorator
                    class="net.logstash.logback.decorate.FeatureJsonGeneratorDecorator"/>
        </encoder>
    

    然后设置pattern模式,如下:

       <providers>
           <pattern>
               <pattern>
                   {
                       "date": "%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ}",
                       "level": "%level",
                       "msg": "%msg %n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"
                   }
               </pattern>
           </pattern>
       </providers>
    

    注意:providers是要包含在encoder下面。

    具体XML详情如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true" scanPeriod="30 seconds" packagingData="true">
    
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
                <jsonGeneratorDecorator
                        class="net.logstash.logback.decorate.FeatureJsonGeneratorDecorator"/>
                <providers>
                    <pattern>
                        <pattern>
                            {
                            "date": "%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ}",
                            "level": "%level",
                            "msg": "%msg"
                            }
                        </pattern>
                    </pattern>
                </providers>
            </encoder>
    
        </appender>
    
        <root level="debug">
            <appender-ref ref="STDOUT"/>
        </root>
    </configuration>
    

    配置就那么点点,是不是觉得非常的简单,这样就能实现日志json输出,而且如果想要对json进行格式化输入,直接配置更改jsonGeneratorDecorator就可以了。更改为如下:

    <jsonGeneratorDecorator class="net.logstash.logback.decorate.PrettyPrintingJsonGeneratorDecorator"/>
    

    结果如图:

    pretty json
    相对来说使用logstash-logback-encoder实现更简单,而且而且官方也提供了其他扩展性功能,也能够实现自定义扩展。

    四、扩展

    在开发的时候我们希望能够走Spring Boot原生的日志显示,生产时候显示Json或者格式化显示Json。如果可配置那就方便了,其实可以通过logging.config指定不同文件就可以了。但还有一种方式——表达式。logback 在配置文件中支持通过 <if>、<then>、<else> 元素作为条件语句来区分不同的环境。条件处理需要 Janino 环境的支持。需要引入依赖,如下:

    <dependency>
        <groupId>org.codehaus.janino</groupId>
        <artifactId>janino</artifactId>
        <version>2.6.1</version>
    </dependency>
    

    同时我们可以在logback中定义变量读取配置文件的信息,如下:

    <springProperty scope="context" name="logType" source="logging.type" defaultValue="normal" />
    

    接着在表达式里面进行判断:

    <if condition='property("logType").equals("normal")'>
    ......
    </if>
    

    代码实例:log

    参考

    展开全文
  • 在本博文中,我们将展示如何在Spring Boot应用程序中格式化JSON日期字段。我们将探讨使用Jackson格式化日期的各种方法,Jackson被Spring Boot用作默认的JSON处理器。 2.在日期字段上使用@JsonFormat 2.1设置格式 ...

    1.概述

    在本博文中,我们将展示如何在Spring Boot应用程序中格式化JSON日期字段。我们将探讨使用Jackson格式化日期的各种方法,Jackson被Spring Boot用作默认的JSON处理器。

    2.在日期字段上使用@JsonFormat

    2.1设置格式

    我们可以使用@JsonFormat注解来格式化特定字段:

    package com.example.domain;
    
    import java.io.Serializable;
    import java.time.LocalDate;
    import java.time.LocalDateTime;
    
    import com.fasterxml.jackson.annotation.JsonFormat;
    
    public class User implements Serializable{
    	
    	private Integer userId;
    	
    	private String userName;
    	
    	private String passWord;	
    	@JsonFormat(pattern = "yyyy-MM-dd")
    	private LocalDate birthday;
    	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    	private LocalDateTime createTime;
    
    }
    

    在birthday字段上,我们使用的格式只显示日期,而在 createTime字段中我们也包含时间。 这里我们使用了Java 8日期类型,它们非常便于处理时态类型。当然,如果我们需要使用像java.util.Date 这样的遗留类型 ,我们可以以相同的方式使用注释:

    public class User implements Serializable{
    	
    	private Integer userId;
    	
    	private String userName;
    	
    	private String passWord;	
    	@JsonFormat(pattern = "yyyy-MM-dd")
    	private Date birthday;
    	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    	private Date createTime;
    
    }

    最后,让我们看看使用给定日期格式的@JsonFormat 呈现的输出 :

    {    
        "birthday":"2019-02-03",
        "createTime":"2019-02-03 10:08:02"
    }

    2.2设置时区

    另外,如果我们需要使用特定的时区,我们可以设置@JsonFormat的timezone属性:

    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate birthday;

    如果类型已包含时区,则不需要使用它,例如使用 java.time.ZonedDatetime.

    3.配置默认格式

    虽然@JsonFormat本身很强大,但对格式和时区进行硬编码可能会让我们陷入困境。 如果我们要为应用程序中的所有日期配置默认格式,则更灵活的方法是在application.properties中配置它:

    #配置日期格式
    spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
    #日期的时区
    spring.jackson.time-zone=GMT+8
    

    尽管设置这样的默认格式非常方便直接,但这种方法存在缺陷。不幸的是,它不适用于Java 8日期类型,如 LocalDate 和 LocalDateTime - 我们只能使用它来格式化java.util.Date或 java.util.Calendar类型的字段 。 但是,我们很快就会看到希望。

    4.自定义Jackson的ObjectMapper

    因此,如果我们想使用Java 8日期类型 并 设置默认日期格式,那么我们需要查看创建一个 Jackson2ObjectMapperBuilderCustomizer bean:

    package com.example.config;
    
    import java.time.format.DateTimeFormatter;
    
    import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
    import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
    
    @Configuration
    public class DateFormatConfig {
    	
    	private static final String dateFormat = "yyyy-MM-dd";
    	
    	private static final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss";
    	
    	@Bean
    	public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
    		return builder -> {
    			builder.simpleDateFormat(dateTimeFormat);
    			builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
    			builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
    		};
    	}
    
    }
    

    上面的示例显示了如何在我们的应用程序中配置默认格式。我们必须定义一个bean并覆盖其自定义方法以设置所需的格式。 虽然这种方法可能看起来有点麻烦,但它的优点在于它适用于Java 8和遗留日期类型。

    展开全文
  • spring boot 时间格式化解决

    千次阅读 2018-11-01 20:49:50
    -mysql列类型为datetime,实体类对应列类型为LocalDateTime...解决办法:spring boot application.yml配置文件配置 jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+ 8 并将实体类对应列类型改为Date ...
  • Spring boot jackson 格式化时间不生效

    千次阅读 2019-05-05 16:38:15
    我说在网上看的配置方法 https://blog.csdn.net/u011544437/article/details/84823724 配置完后我的 时间还是不生效 还是回传的 时间戳。 找个各种解释都说是拦截器继承的WebMvcConfigurationSupport ...
  • Spring boot格式化

    2018-09-08 10:13:28
    格式化器 WebMvcAutoConfiguration 自动配置 dateFormatter 格式化器,格式化日期 getDateFormat 默认日期格式,采用斜线的方式 可以通过配置文件 修改为短横线的方式 spring.mvc.date-format=yyyy-...
  • Spring Boot 提供了 spring.jackson.date-format配置可以让我们进行日期格式化, 但它只能格式化 java.util.Date。 解决方案: 定义一个配置类,在配置类注入两个 Bean 实现日期全局格式化,同时还兼顾了 Date 和 ...
  • date-format: yyyy-MM-dd HH:mm:ss #日期格式化 time-zone: GMT+8 #时区 locale: zh_CN #国际化 日期格式化字符串:yyyy-MM-dd HH:mm:ss,之前我将HH写成hh发现时区正确但是日期是12小时制的,最后改为...
  • U盘格式化启动工具:USBBOOT 1.7
  • 问题:接口在返回数据的时候,实体类Date类型的字段日期格式不是业务需要的,所以需要进行格式化。 方式一: ① pom.xml引入jackson依赖 <dependency> <groupId>com.fasterxml.jackson.core</...
  • LocalDateTime在spring boot中的格式化配置 在项目中日期格式化是最常见的问题,之前涉及的java.util.Date 和 java.util.Calendar 类易用性差,不支持时区,非线程安全,对日期的计算方式繁琐,而且容易出错,因为...
  • 在Spring Boot对JSON的处理类中,定义了annotationIntrospector属性,专用于处理注解,因此自定义日期格式化的步骤分为四步,如下: 1. 定义日期格式化注解,用于盛放格式化样式; 2. 定义日期JSO
  • 在访问/actuator/health的过程中,json没有格式化。 解决 在application.properties文件中,添加如下配置: spring.jackson.serialization.indent_output=true 效果 这样json就会自动被格式化处理。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 146,657
精华内容 58,662
关键字:

boot无法格式化