最近做項目用到了spring的新特性@RequestBody,非常好用,客戶端發送的json串直接給轉換並且注入給bean,以前自己用都是按照SUN的java命名規範進行的項目開發,沒發覺有什麼異常。
給客戶做項目,得按照客戶的需求來,客戶的需求是不受什麼規範約束的,恰好客戶給的需求是json串裏面的變量名首字母全是大寫,囧,如果按照常規java命名規則的話這是給class命名的方法。
等到做出幾個接口之後,自己測試時,發現用@RequestBody死活將客戶端傳過來的變量賦不到相應的bean中,一時的感覺真是有點無奈,客戶不按規則出牌,自己必須給他的不按規則買單。
經過思考,通常的Controller類是可以自己指定名字的,指定的方法就是@Controller("XXX"),那麼與json串對應的bean裏面的變量應該也是可以自用指定名字的,經過一番搜索終於找到了答案。
1.正確的處理方法:
給每個屬性指定別名,指定的方法與controller類似,如下:
public class User {
@JsonProperty(value = "Name")
private String name;
@JsonProperty(value = "Age")
private int age;
}
經過指定相應的名字後,我遇到的問題就被解決了。
2.分析出現錯誤的原因:
由於注入時,使用的是setName(...),setSex(...),按照java的命名規範,對應的變量,name和sex會被賦值,但是如果變量命名爲Name和Sex的話,雖然生成的setter函數依然是setName(...),setSex(...),但是spring框架注入時就無法分辨到底是name還是Name,依然會按照命名規則來,所以依然會給name賦值,如果恰好沒有按照命名規則來,使用的是Name的話,就無法完成注入。
3.結論:
編寫java在沒有其他原因的情況下,最還還是按照java編程規範來編寫,畢竟是一套約定俗成的規則,大家都在按照這個規則在做事,如果不按常理出牌,那麼出問題是不可避免的,出了這種問題解決起來也是相當的麻煩,畢竟spring框架不是誰都能改的。