本文是個人在做spring boot微服務改造時遇到的一些坑,簡單記錄一下。
一、spring boot熱部署
spring boot熱部署有兩種方式:
在spring-boot-maven-plugin中添加springloaded依賴,pom如下:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin </artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.4.RELEASE</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
坑:添加依賴後熱部署不起作用
解決方案:
1、設置IDEA允許應用自動編譯,共兩處設置
2、spring boot應用必須使用spring boot-run的方式啓動
3、spring boot-run啓動時,maven的倉庫地址中不能有空格,否則會導致啓動報錯,找不到springloaded的jar包。
使用dev_tools:
添加jar包依賴,spring-boot-maven-plugin中添加fork參數,該種方式對熱部署的支持更全面一些,但修改後會導致應用頻繁重啓,個人最後使用的是該種方式
二、spring boot添加mybatis支持
1、使用自定義mybatis配置文件
在spring boot配置中添加:
mybatis:
mapper-locations: classpath:mapper/*.xml
config-location: classpath:mybatisConfiguration.xml
坑:使用mybatis時自定義的分頁插件時,報錯:找不到方法StatementHandler.prepare
解決方案:mybatis 3.4 版本StatementHandler.prepare添加了一個int類型參數,修改如下:
@Intercepts({@Signature(type =StatementHandler.class, method = "prepare", args ={Connection.class, Integer.class})
坑:spring boot添加mybatis後啓動時報錯:required a single bean, but 2 were found
解決方案:在spring boot啓動類的@MapperScan註解中指定annotationClass:
@MapperScan(value = "com.asiainfo.microservice", annotationClass = org.springframework.stereotype.Repository.class)
當然,對應dao接口需要添加@Repository註解
三、spring boot服務依賴
坑:找不到依賴jar包中的類
解決方案:spring boot使用spring-boot-maven-plugin打出的jar包不能直接提供給第三方依賴,需修改配置單獨打一個可依賴的jar包,如A依賴B,
在B中添加:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>api-jar</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classifier>api</classifier>
</configuration>
</execution>
</executions>
</plugin>
在A中添加:
<dependency>
<groupId>XXXX</groupId>
<artifactId>XXXX</artifactId>
<version>1.0-SNAPSHOT</version>
<classifier>api</classifier>
</dependency>
四、spring boot自動配置
坑:找不到配置
描述:如A依賴的第三方jar包B中包含mybatis,在A啓動時spring boot就會自動查找datasource配置,找不到就報錯
解決方案:注意依賴傳遞,禁用無關依賴
五、spring boot掃描範圍
在spring boot 的啓動類可以通過@ComponentScan註解指定掃描範圍,不加的話默認掃描啓動類所在包及其子包,
如依賴的第三方jar中有需要掃描的類,需在@ComponentScan中指定。
6、restTemplate服務調用
使用restTemplate進行微服務之間的調用,get方法拼接url參數時,如果有json格式的參數,會報錯url不合法,
url合法字符中不包含{、}、“,無法直接用get方法傳遞json參數。如對特殊字符轉義的話,會導致jackson解析json
爲object出錯,該問題未解決,目前使用方式爲不在get方法中傳遞json格式參數。