您的位置:首页 > 编程语言 > Java开发

Spring boot jackson 时间格式问题

2017-07-01 00:00 1081 查看
这个问题是具体表现是这样的:

Spring boot Application 直接使用IDEA 运行没有任何问题,使用maven 打包也不存在问题,但是在打包之后执行时一直提示出现错误。错误的信息大致如下:

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2017-06-30 23:36:35.931 ERROR 11916 --- [           main] o.s.boot.SpringApplication               : Application startup failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jacksonObjectMapperBuilder' defined in class path resource [org/springframework/boot/autoconfigure/jackson/JacksonA
utoConfiguration$JacksonObjectMapperBuilderConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instanti
ate [org.springframework.http.converter.json.Jackson2ObjectMapperBuilder]: Factory method 'jacksonObjectMapperBuilder' threw exception; nested exception is java.lang.IllegalArgumentException: name
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599) ~[spring-beans-4.3.9.RELEASE.jar!/:4.3.9.RELEASE]

错误信息很多,干扰很多,不过最重要的是 jackson 的问题。

引起这个问题的原因是:

spring boot 往网页上输出了一个包含Date 的jason 字符串。

这个Date 转化为jason 的时间格式写在 application.yml 文件中:

spring:
jackson:
date-format: HH:mm:ss.SSSSSS
joda-date-time-format: HH:mm:ss.SSSSSS


删除application.yml 中的这几行,这个问题就不存在了。

删除之后, mvn clean package 打包不存在问,打包之后也能够正常输出, 但是会将时间字符串变成时间戳!

正常的是这样:

{
"id": 42,
"curingTime": "15:35:55.000370"
}

删除之后变成了这样:

{
"id": 43,
"curingTime": 56720161
}


使用 Gson 解决这个问题

这种情况下,我暂时不知道怎么解决。不过我通过不断查找,发现一个使用Gson 替代的方案:

首先,排除所有jackson 依赖!

pom.xml 中更改如下:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!--排除jackson 依赖-->
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--添加gson-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>

因为Spring boot 在不存在jackson 的时候会自动查找gson, 因此这样就可以直接用了。

然后, 更改jpa 表中的Date 项(如果有的话,因为jackson 都不存在了,所有依赖他的都必须要改):

@Temporal(TemporalType.TIME)
@DateTimeFormat(pattern = "HH:mm:ss.ssssss")
//@JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "HH:mm:ss.SSSSSS",timezone = "GMT+8")
private Date curingTime;

然后,重新在application.yml
7fe0
文件中添加上面被删掉的代码!

此时运行程序,得到的结果多半是这样的:

{
"id": 44,
"curingTime": "Jan 1, 1970 11:55:00 PM"
}

还是与目标不符合,但是已经接近目标了!

最后一步:启动类中添加Gson Bean, 如下:

public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}

@Bean
public Gson getGson() {
Gson gson = new GsonBuilder().setDateFormat("HH:mm:ss.SSSSSS").create();
return gson;
}

Spring boot 会自动加载这个Bean,达到了最终目的!

其实,加上Gson 之后,application.yml 中的那三行代码就可以不用要了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息