spring boot +jpa的文章網絡上已經有不少,這里主要補充一下用kotlin來做捉撮。
kotlin里面的data class來創(chuàng)建entity可以幫助我們減少不少的代碼飞袋,比如現(xiàn)在這個User的Entity,這是Java版本的:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String firstName;
private String lastName;
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}
上面的那一大段變成kotlin叛溢,就像下面的這樣的:
@Entity
data class User(@Id @GeneratedValue(strategy = GenerationType.AUTO) val id: Long = 0L, val firstName: String = "", val lastName: String = "")
連我這個用C#的人都覺得動心啦租,如果你是Java的開發(fā)者嘉熊,真的可以考慮試試看闯估。
不過,這里還有個小提示,在kotlin里,如果你不給User給出默認的構造函數(shù)诊沪,那是會報錯的,報錯信息為
o.s.boot.web.support.ErrorPageFilter : Forwarding to error page from request / due to exception No default constructor for entity: : com._1b2m.springbootkotin.User; nested exception is org.hibernate.InstantiationException: No default constructor for entity: : com._1b2m.springbootkotin.User
提示是沒有默認的構造函數(shù)曾撤,我們可以為User類的構造函數(shù)增加參數(shù)默認值來完成端姚,就如同上面我寫的樣子。
題外話盾戴,在Java里寄锐,IDE可以幫助我們生成getter和setter。但是就算是這樣尖啡,也沒有像kotlin那樣能把那么長的代碼縮成一行,一個entity一行就寫完剩膘,這感覺很不要太好衅斩。
另外,在Java里怠褐,使用CrudRepository時畏梆,這樣用就行:
@Autowired
UserRepository repository;
但是在kotlin里,編譯都無法通過奈懒,會報出這樣一條錯誤:
property must be initialized or be abstract
要解決這個問題奠涌,需要增加lateinit,就像 這樣:
@Autowired
lateinit var repository: UserRepository
其他的基本跟Java一致磷杏。
本文提到的源碼放在github
在寫spring boot程序時溜畅,kotlin的確少寫了非常多的代碼,這令我對這門語言也有所期待了极祸。