定制网站json传参到java接口部分参数接收不到

json定制网站传参到部分参数接收不到-问题深究

一、问题描述:

定制网站使用传参时,定制网站接口参数中有部分参数定制网站被传递进了接口内部,定制网站还有部分参数没有接收到,如下图:定制网站第一张图是postman接口参数,定制网站第二张图是接收到的参数
图一:

图二:

二、问题解决:

定制网站这个问题其实解决很简单,就是json定制网站数据转化为实体的过程,找寻get、set方法失败,定制网站导致数据无法正常从json定制网站映射到实体,定制网站从而出现的问题。定制网站解决起来两个方法,第一种就是改变量名,这种不建议使用,改动量较大,需要将、VO等都需要更改,有的甚至还需要动sql,第二种就是加个注解即可,告诉实体把某个json值就给当前的属性就行,比如上面例子我们可以给pOrgCode这个属性加如下的注解:

    @JsonProperty(value = "pOrgCode")    String pOrgCode;
  • 1
  • 2

这里的注解是com.fasterxml.jackson.annotation.JsonProperty这个包下面的注解。

三、问题原因

变量名的前两个字母出现了大写
下面一起探讨下,这个过程是如何失败的,失败的具体点又是什么
其实根本原因还是在get、set方法和属性的命名上,下面pojo的代码

@RequiredArgsConstructor@Dataclass DataDTO{    String pOrgCode;    String name;    String uName;    String isTrue;    String Lname;    String NAme;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

可以看到代码没有什么特别的,上面的@Data是lombok的注解,可以省去我们写get、set、toString等方法。
下面再看下真正编译后的文件是什么样吧,如下:

class DataDTO {    String pOrgCode;    String name;    String uName;    String isTrue;    String Lname;    String HOme;    public DataDTO() {    }    public String getPOrgCode() {        return this.pOrgCode;    }    public String getName() {        return this.name;    }    public String getUName() {        return this.uName;    }    public String getIsTrue() {        return this.isTrue;    }    public String getLname() {        return this.Lname;    }    public String getHOme() {        return this.HOme;    }    public void setPOrgCode(String pOrgCode) {        this.pOrgCode = pOrgCode;    }    public void setName(String name) {        this.name = name;    }    public void setUName(String uName) {        this.uName = uName;    }    public void setIsTrue(String isTrue) {        this.isTrue = isTrue;    }    public void setLname(String Lname) {        this.Lname = Lname;    }    public void setHOme(String HOme) {        this.HOme = HOme;    }    //此处省略无关方法若干}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62

从上面的编辑结果我们可以看到两种情况:

1.首字母小写就是将首字母进行大写其然后前面拼接get、set2.首字母大写则保持不变前面拼接get、set
  • 1
  • 2

下面看下这种场景下后台接收到的参数展示:

通过上面图片可以看出,只要前两个字母出现了大写字母,那么lombok生产的get、set方法是找寻不到真正的属性的,所以json转化实体就出了过程。
下面笔者又尝试了使用idea自动生成get、set方法,经实现,产生的get、set等如下:

class DataDTO {    String pOrgCode;    String name;    String uName;    String isTrue;    String Lname;    String HOme;    public String getpOrgCode() {        return this.pOrgCode;    }    public void setpOrgCode(String pOrgCode) {        this.pOrgCode = pOrgCode;    }    public String getName() {        return this.name;    }    public void setName(String name) {        this.name = name;    }    public String getuName() {        return this.uName;    }    public void setuName(String uName) {        this.uName = uName;    }    public String getIsTrue() {        return this.isTrue;    }    public void setIsTrue(String isTrue) {        this.isTrue = isTrue;    }    public String getLname() {        return this.Lname;    }    public void setLname(String lname) {        this.Lname = lname;    }    public String getHOme() {        return this.HOme;    }    public void setHOme(String HOme) {        this.HOme = HOme;    }    public DataDTO() {    }    //此处省略无关方法}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

从生产的get、set方法上看,这两种生产略有差别,但是值得注意的是使用idea生成的get、set一样也接收不到数据,如下图

比对发现,其实并不是lombok多不好用,这种场景下我们使用idea其实也是一样的结果。

四、使用postman请求接口会出这种问题,那接口和接口之前的调用会不会有这种问题?

上面这个问题是需要分场景的

1.http调用场景

答案是:部分是部分否,也就是说http调用就会有上述我们碰到的问题,但是只要一部分字段有这总问题,postman其实就是模仿http客户端发出请求调用接口的。

@RestController@RequestMapping("/org")public class TestController {    @PostMapping("/test2")    public void testJson(@RequestBody DataDTO dataDTO){        System.out.println(dataDTO.toString());        System.out.println(dataDTO.toString());    }    @PostMapping("/test")    public void testJson2(@RequestBody DataDTO dataDTO){        HttpClientUtil httpClientUtil = new HttpClientUtil();        dataDTO = new DataDTO();        dataDTO.setpOrgCode("666");        dataDTO.setHOme("555");        dataDTO.setIsTrue("444");        dataDTO.setLname("333");        dataDTO.setName("222");        dataDTO.setuName("111");        Map<String,String> headMap = new HashMap<>();        headMap.put("Content-type","application/json;charset=UTF-8");        String s = httpClientUtil.doPost("http://localhost:8888/org/test2", headMap, JSONObject.toJSON(dataDTO).toString());        System.out.println("调用结束");    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

如上代码,从新包了一个接口用于调用原接口,接口调用使用http方式来调用,这样原接口的输出结果如下所示:

然后我们发现除了前两个字母都是大写的场景下会出问题,其他都是ok的,所以这种问题其实也算是工具的问题。

2.RPC调用场景

若是RPC调用传递还是JSON结论则和HttpClient调用没啥区别了,若是传递实体则不用有这种问题了。

五、总结

出现这个问题的原因是使用postman调用接口传递json解析失败造成的,后面使用httpclient验证,只有在前两个字母均是大写的场景下,使用httpclient才会出问题,正常情况下postman会出问题的场景,httpclient并没有,所以平时代码还是放心写就是,当然为了以防万一我们一定不要写这种代码(属性前两个字母出现大写),若是非要这么写也要加个注释:JsonPropertity(value=“filedName”)。

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发