应用之间交互,不像前后台之间交互,那么方便可以定义命名一致,因为正常开发中,可能是多个团队编写的接口去互相访问,因此开发过程接收方和发送方传递的参数命名可能不完全一致,所以,你单纯的定义一个对象去接收,如果命名不一致,你就会得不到值。
如果在联调时才发现这种情况,再去改字段,可能涉及多个文件的依赖关系,改起来很麻烦。
因此接口见交互使用json来接收数据。
通过@JSONField,可以使接口报文的字段映射到@JSONField name指定的字段。
然后再去通过set方法去赋值给你对应的java bean属性,所以这也是为什么需要你提供对应java bean的set方法,且是public的原因。
1.2.83结果表格(1.2.70都正常取值)
报文 | @JSONField | 转换结果 |
---|---|---|
“appId”:“app_id”, | @JSONField(name = “app_id”) | 取值为null |
“app_id2”:“app_id2” | @JSONField(name = “appId2”) | 正常取值 |
“op_id”:“op_id”, | //bean关系①:驼峰接收 @JSONField(name = “op_id”) private String opId; | 正常取值 |
“op_id1”:“op_id1”, | //bean关系②:原值接收 @JSONField(name = “op_id1”) private String op_id1; | 正常取值 |
“op_id2”:“op_id2”, | //bean关系③:它值接收 @JSONField(name = “op_id2”) private String param; | 正常取值 |
Json报文
{
"op_id":"op_id",
"op_id1":"op_id1",
"op_id2":"op_id2",
"appId":"app_id",
"app_id2":"app_id2"
}
Bean
@Data
public class Json1 {
/**
* json报文与@JSONField一致
*/
//bean关系①:驼峰接收
@JSONField(name = "op_id")
private String opId;
//bean关系②:原值接收
@JSONField(name = "op_id1")
private String op_id1;
//bean关系③:它值接收
@JSONField(name = "op_id2")
private String param;
/**
* json报文传与@JSONField的驼峰转换
*/
@JSONField(name = "app_id")
private String app_id;
@JSONField(name = "appId2")
private String appId2;
}
Controller
package com.example.helloworld.controller;
import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "hello ==== " + 222;
}
@RequestMapping(value = "/json1", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
public Json1 json1(@RequestBody Json1 json) {
System.out.println(json);
return json;
}
/**
* 为什么用requestJson接?我不想和你的bane属性叫的一样,一样了我也不想改,怎么办?
* @param requestJson
* @return
*/
@RequestMapping(value = "/json2", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
public Json1 json1(@RequestBody String requestJson) {
System.out.println("request json:" + requestJson);
Json1 json1 = JSON.parseObject(requestJson, Json1.class);
System.out.println(json1);
return json1;
}
}
输出结果
1.2.70
request json:{
"op_id":"op_id",
"op_id1":"op_id1",
"op_id2":"op_id2",
"appId":"app_id",
"app_id2":"app_id2"
}
Json1(opId=op_id, op_id1=op_id1, param=op_id2, app_id=app_id, appId2=app_id2)
1.2.83
request json:{
"op_id":"op_id",
"op_id1":"op_id1",
"op_id2":"op_id2",
"appId":"app_id",
"app_id2":"app_id2"
}
Json1(opId=op_id, op_id1=op_id1, param=op_id2, app_id=null, appId2=app_id2)