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