SpringBoot 2.x 升级后的变化

SpringBoot 2.x较之前的版本有不少的改动,以下记录在实际运用中已经遇到的一些问题:

注意:以下差异基于的SpringBoot两个版本分别为 1.5.92.0.2

context-path配置修改

SpringBoot 1.5.9 在properties文件中配置 context-path 的方式如下所示:

server.context-path = XXX

而在SpringBoot 2.0.2中其配置方式变成了

server.servlet.context-path = XXX

这样的改变使 context-path 的归属更加明确,与之一同更改的还有其他多个参数,具体请参考: ServerProperties#Servlet

java时间类型通过Jackson转换后输出格式的变化

使用 SpringMVC 时,如果 Controller 中的方法使用 @ResponseBody 标注的话,则返回结果一般会使用 jackson 将返回结果转换为 json (并非绝对,如果没有引入 jackson 相关jar包而引入了 gson 相关jar包,则转换 json 的操作就由 gson 来完成,以下讨论只适用于 jackson 操作)。

在使用SpringBoot 1.5.9的时候,如果未指定具体的时间格式的话,通过 @ResponseBody 返回带有 java时间类型的结果时,默认会将 java 时间类型( java.util.Datejava.util.Calendarjava.sql.Datejava.sql.Timestamp 等)以时间戳(当前时间的毫秒数)返回,而在SpringBoot 2.0.2则返回格式是经过了格式化的: yyyy-mm-ddTHH:mi:ss。通过对比发现,在SpringBoot 2.0.2自动配置 jackson 时添加了如下配置:

configureFeatures(builder, FEATURE_DEFAULTS);

=====================

private static final Map<?, Boolean> FEATURE_DEFAULTS;

static {
	Map<Object, Boolean> featureDefaults = new HashMap<>();
featureDefaults.put(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
FEATURE_DEFAULTS = Collections.unmodifiableMap(featureDefaults);
	}

其重点是 SerializationFeature.WRITE_DATES_AS_TIMESTAMPS 被设置为了 false,即输出时间格式不以时间戳形式展示,其最终影响的是 jackson 中的 ObjectMapper 对象。

如果想要继续返回时间戳格式的数据,则只需要在properties配置文件中添加如下配置即可:

spring.jackson.serialization.write-dates-as-timestamps=true

还有另外一种比较复杂的解决方案,即使用 jackson 中提供的 @JsonSerialize 注解,并提供自己实现的 JsonSerializer。具体实现方案可以参考以下链接: SpringMVC使用@ResponseBody时返回json的日期格式、@DatetimeFormat使用注意

注意:SpringBoot 2.0.2 对 java 时间格式的影响对 java8 中新增的 java.time.LocalDateTime 并没有效果,当设置 spring.jackson.serialization.write-dates-as-timestamps=true 时,java.time.LocalDateTime会被转换成一个形如 [2018,5,31,17,58,35] 的数组,而非毫秒数。引用jackson-modules-java8中的描述:

LocalDate, LocalTime, LocalDateTime, and OffsetTime, which cannot portably be converted to timestamps and are instead represented as arrays when WRITE_DATES_AS_TIMESTAMPS is enabled.

@ConfigurationProperties配置的限制

SpringBoot 中可以使用 @ConfigurationProperties 将一个实体类转变为可配置的类(在properties文件中可以直接配置对应参数的值,如果使用IDE的话,会自动提示)。在 SpringBoot 1.5.9 中设置 @ConfigurationPropertiesprefix 属性时,使用驼峰命名(如eclipseLink)不会有任何问题,但在 Spring Boot 2.x 启动时会报错:

InvalidConfigurationPropertyNameException: Configuration property name '********' is not valid.

当使用eclipse-link时就不会有任何问题。关于这个问题的讨论参考以下链接:

Could not bind properties

Spring Boot 2.0 doesn't allow camelcase for ConfigurationPropertyName

Spring官网对于推荐的格式说明:boot-features-external-config-relaxed-binding

多数据源配置问题

Spring Boot 2.x中如果配置了多个数据源的话,其中有一项配置是需要注意的:spring.datasource.url!这样的配置有可能是有问题的,需要将其设置成 spring.datasource.jdbc-url

Stack Overflow对于这个问题的讨论

转载于:https://my.oschina.net/u/3529605/blog/1831137

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值