springboot 2.x版本已經發行很長時間了,但我們項目依舊使用的時1.x的版本,最近手頭上的工作略微少了一點,趁此機會想着升級一把springboot的版本。spring的官網(https://start.spring.io/)目前最新穩定版已經是2.2.6了,而且添加了不少新特性呢,來,搞起來;
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.2.6.RELEASE)
①把原來的springboot的版本依賴,從pom文件中拿掉,換成新版本的依賴信息;當然springboot2.2.6版本支持的JDK版本已經要求最低1.8了,別忘記了哦~,還有一些依賴的版本要註釋掉,比如netty jackson ; 有一些依賴的版本要換成新版的,比如fastjson(1.2.46 --> 1.2.58)
<springboot.version>2.2.6.RELEASE</springboot.version>
<java.version>1.8</java.version>
<!--<netty.version>4.0.33.Final</netty.version>-->
<!--<jackson.version>2.7.2</jackson.version>-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<!--<version>4.5.2</version>-->
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<!--<version>1.2.46</version>-->
<version>1.2.58</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<!--<version>1.11.12.RELEASE</version>-->
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--<version>5.1.42</version>-->
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<!--<version>4.0.33.Final</version>-->
</dependency>
②我們的項目使用了Cassandra的數據庫,配置了Cassandra的連接信息,要修改一些地方;
默認開啓jmxreport會報錯:https://stackoverflow.com/questions/53101753/spring-boot-data-cassandra-reactive-jmxreporter-problem
dbConf:
old: import org.springframework.data.cassandra.config.java.AbstractCassandraConfiguration;
new: import org.springframework.data.cassandra.config.AbstractCassandraConfiguration;
dbConn:
CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean();
cluster.setJmxReportingEnabled(false); //默認是開啓Jmxreport,我們需要關閉它
dbModel:
old: import org.springframework.data.cassandra.mapping.Table;
new: import org.springframework.data.cassandra.core.mapping.*;
③項目中以前的findOne方法和delete方法在springboot2.x版本中均已被移除;
方法調用的改變:
使用deleteById(Long id)來替換,還有一個不同點是deleteById(Long id)默認實現返回值爲void;
deviceRepo.findOne(devEUI); ---> deviceRepo.findBySN(devEUI); //這裏是自己實現的自定義 Sql方法 或者 使用 findById方法;並使用isPresent做非空判斷
//return deviceRepo.findOne(devEUI);
//return deviceRepo.findBySN(devEUI);
if (deviceRepo.findById(devEUI).isPresent()) {
return deviceRepo.findById(devEUI).get();
}
return null;
deviceRepo.delete(endpoint); ---> deviceRepo.deleteById(endpoint);
deviceRepo.exists(uplink.getSerialNumber()) ---> deviceRepo.existsById(uplink.getSerialNumber())
deviceRepo.findOne(device.getEndpointName()) ---> deviceRepo.getOne(uplink.getSerialNumber()) //這裏Oracle是使用getOne方法或findById方法均可
④配置文件application.yml也有一些地方需要修改,因爲2.x版本的連接池由tomcat-pool換爲HikariPool,連接配置要修改;
##這裏是oracle或者mysql連接配置的修改;
url: ---> jdbc-url:
##這裏應該是springboot以後要支持更多的servlet配置,以數組的形式配置,但是不修改也不影響
context-path: / ---> servlet:
context-path: /
##logback的配置有所變化,但是不修改也不影響
logging:
config: classpath:logback.xml
⑤有oracle配置的話,find方法可能要注意命名規範的問題,在2.x版本中對此的檢查更加嚴格;
Caused by: org.springframework.data.mapping.PropertyReferenceException: No property SN found for type Device!
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: * near line 1, column 8 [SELECT * FROM com.company.model.Device WHERE serial_num = :serial_num]
//數據庫字段爲serial_num,參數名爲serialNum
@Id
@Column(name = "serial_num", unique = true, nullable = false)
private String serialNum;
//自定義的sql方法,必須是跟參數名一致,否則就會報錯
@Query("SELECT * FROM device WHERE serial_num = :serial_num")
Device findBySerialNum(@Param("serial_num") String serial_num);
⑥oracle配置: 下面的報錯只需要將原來的property name 'oracleDS' 改爲 ‘oracle’即可,原因下面的報錯信息也有提示的。
Description:
Configuration property name 'oracleDS' is not valid:
Invalid characters: 'D', 'S'
Bean: entityManagerFactoryPrimary
Reason: Canonical names should be kebab-case ('-' separated), lowercase alpha-numeric characters and must start with a letter
Action:
Modify 'oracleDS' so that it conforms to the canonical names requirements.
@Bean(name = "primaryDataSource")
@Primary
@Qualifier("primaryDataSource")
@ConfigurationProperties(prefix="oracle") //原來是 @ConfigurationProperties(prefix="oracleDS")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
至此,愉快的打包運行測試即可啦。。。 。。。
2020-04-30 13:25:15.480 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
2020-04-30 13:25:15.805 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
... ...
2020-04-30 13:32:12.917 [main] INFO o.s.orm.jpa.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'primaryPersistenceUnit'
2020-04-30 13:32:12.918 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
2020-04-30 13:32:12.940 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.