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;
      }

 

posted @ 2016-08-24 10:53  westfruit  阅读(11863)  评论(0编辑  收藏  举报