spring中使用@RequestBody 接收到的對象值為空


第一次使用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;
      }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM