第一次使用java開發項目,涉及到的技術有 Dubbo+SpringMVC+Zookeeper+Kafka+MongoDb 。
第一個任務是設計一個商品日志的存儲與查詢的服務接口,邏輯實現用的是Dubbo+SpringMVC,數據保存在MongoDb中,Zookeeper作為服務中介。由於使用頻率並不是很高 Kafka 消息隊列並沒有用到。
調用方是用.NET寫的管理后台,第一次調通就發現有問題,部分數據值沒有接受到,從Controller進來就是空值。
部分字段值沒有接收到,找java組的同事看了下,說我的字段命名不符合java規范,至於接收不到的原因還不清楚。
我重新按照java命名規范設計了一個新的class,重新測試問題全部解決,看來按照規范來能避免很多坑。
以下是網友的解決方案
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框架不是誰都能改的。
最后說一下C#與Java中的屬性命名規范的不同:
c#簡寫 public string ProductTitle { get; set; } 按照大駝峰命名法,一般要求首字母大寫
c#完整 private string title=""; //私有變量
public string ProductTitle //序列化為json時以這個為准
{
get{return this.title;}
set{this.title=value;}
}
java private String productTitle;//按照小駝峰命名法,這個才是屬性而不是C#中的私有變量,序列化為json時以這個為准
public String getProductTitle()
{
return title;
}
public void setProductTitle(String value)
{
title = value;
}

