1. 程式人生 > >spring boot開發遇到的一些坑

spring boot開發遇到的一些坑

本文是個人在做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格式引數。