SpringBoot - Upgrade (v1.5.10.RELEASE -- v2.2.6.RELEASE)

    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.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章