最近剛開始看《Spring Cloud與Docker 微服務架構實戰》一書,打算學習點微服務的相關技術,但是我是沒有SpringBoot的基礎的,所以即便一個最簡單的Demo竟然都讓我舉步維艱,至少踩中了四個坑,所以特此記錄下,也給同樣剛學的朋友們一點經驗。
案例很簡單,使用Maven搭建Spring boot項目,編寫一個用戶服務提供者。
首先第一個坑就是,application.yml配置文件的問題。
由於我是看着書敲的,自己創建的yml文件,在eclipse中就像編輯最普通的txt文本文檔一樣艱難,沒有任何提示,但我沒想到格式會這麼嚴格,不論怎麼敲就是報錯。
我是怎麼解決的?後來我去Spring官網下載了一個Spring Tool Suite插件,http://spring.io/tools/sts/all,安裝後再次打開application.yml文件就變爲了下面這個樣子
有着很明顯的顏色區分。但我還是報錯,出錯的地方在hibernate: ddl-auto: none 那塊兒,總是提示寫在這裏不被允許。我是真的很鬱悶,後來才仔細對比下,竟然是空格的問題。
原因就是這樣,前面一開始就錯了,但在hibernate節點那兒才報錯,讓我誤以爲是那塊兒出錯了。
第二坑,H2數據庫插入數據時顯示未找到列
這哪裏有錯?嗯?反反覆覆看了好幾遍,我擦,書裏是單引號。不會是這個問題吧?(注意看這裏的varchar類型數據用雙引號包裹是綠色的),於是我又換成了單引號
居然變成了藍色的了?一運行居然通過了。我的內心是崩潰的,MySQL寫雙引號或者單引號都是沒問題的,所以我潛意識認爲這個H2也是可以的....哎,差點讓我懷疑人生。
再次提醒,H2數據庫varchar類型插入時得用單引號,親測。。。
第三坑,方法路徑沒問題,項目啓動就是頑強的404
@RestController
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/{id}")
public User getUserByID(@PathVariable Long id){
User user = userRepository.findOne(id);
return user;
}
}
所以肯定不是路徑的問題,於是我就去百度了一下,發現這個啓動類和Controller的位置貌似有點要求。注意
,一開始我的啓動類是寫在com.microservice.main包裏的,而Controller是寫在com.microservice.controller包裏的,這兩個包是同級的,但是啓動類和這個controller包就不是同級的了。
於是最終我將啓動類所在的包調整爲com.microservice,讓controller包變爲和啓動類同級。
於是問題終於解決了。所以這裏提醒下,最好將這個啓動類放到更頂級的目錄下,Controller類要至少和啓動類同級,或者在其子包下。
第四坑,註解問題導致org.Hibernate.AnnotationException
意思是在實體類User中沒有定義主鍵。可是我打開User類一看,明明就使用了@Id註解了啊
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column
private String username;
@Column
private String name;
@Column
private Integer age;
@Column
private BigDecimal balance;
........//getter與setter
}
於是納悶了一會兒,看了看是不是包有問題,是不是有多個@Id註解但是我沒導入正確呢?果不其然,原來我引用的竟然是spring data包裏的@Id註解。
由於這裏使用的是JPA+H2數據庫進行快速搭建的例子,所以應當引用JPA中的註解。
也就是最終應當引用persistence包中的註解@Id。
至此,再次運行項目,終於能夠成功訪問了。
可以看到,即便一個小例子,如果不夠認真細心,還是會出一些錯誤讓你抓狂。當然我這是直接照着書敲,並且沒有前置基礎,出錯也是難免的。不過我還是期待接下來的例子繼續出錯,暴露出問題來,然後我再解決~哈哈。