一個簡單的SpringCloud demo踩中的四處坑

    最近剛開始看《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

    解決了配置文件、解決了數據庫的語句問題,我想這個可以愉快的運行項目顯示我想要的結果了吧。但是又給了我一個霹靂,無限404。
    我的Controller方法裏肯定是沒啥問題的,就是get方式傳個參數,應該就能返回User的JSON字符串信息了。

@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。


    至此,再次運行項目,終於能夠成功訪問了。

    

    可以看到,即便一個小例子,如果不夠認真細心,還是會出一些錯誤讓你抓狂。當然我這是直接照着書敲,並且沒有前置基礎,出錯也是難免的。不過我還是期待接下來的例子繼續出錯,暴露出問題來,然後我再解決~哈哈。

    

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