添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

但是在使用 RestTemplate#postForEntity() 进行接口调用后,使用 responseEntity.getBody() 得到的 TimResult 对象的各个属性值都为null。

	private TimResult post(String serviceName, String cmdName, JSONObject reqBody) throws UserSigException {
        final String adminUserSig = adminUserSigHelper.getSignature();
        final long random = ThreadLocalRandom.current().nextInt() & 0xffffffffL;
        String url = String.format(URL_FORMAT, HOST, serviceName, cmdName, tlsSigAPIv2.getSdkappid(), timProperties.getAdminIdentifier(), adminUserSig, random);
        final ResponseEntity<TimResult> responseEntity = httpClientTemplate.postForEntity(url, reqBody, TimResult.class);
        final int statusCodeValue = responseEntity.getStatusCodeValue();
        if (statusCodeValue != 200) {
            log.error("调用TIM后台REST接口失败,url = {},reqBody = {},statusCodeValue = {}", url, reqBody, statusCodeValue);
            throw new RuntimeException("调用TIM后台REST接口失败");
        final TimResult timResult = responseEntity.getBody();
        return timResult;

通过debug分析发现,是因为RestTemplate要将响应的json字符串反序列化为TimResult对象时,从容器中的类型转换器中匹配到了Jackson转换器,然后Jackson进行反序列化时,都没有匹配到TimResult的各个属性。然后查阅资料发现Jackson默认的属性发现规则将会查找到如下所述的属性:

  • 所有被public修饰的成员变量;
  • 所有被public修饰的getXxx()方法;
  • 所有被public修饰的setXxx(value)方法;

由于我们定义的TimResult的属性都是private的,所以Jackson反序列化时是根据publicsetXxx(value)方法名得到首字母小写的属性,但是实际上TimResult的属性都是首字母大小写的,所以都没赋值成功。

若使用FastJson进行序列化、反序列化,就没有这个问题。

解决方法有两种:

  • 直接将bean对象中的属性改为public,属性名命名为首字母大写,比如{"Name":"nomouse","Age":12},定义相应的bean为:
public class TimResult {
   public String ActionStatus;
   public String ErrorInfo;
   public Integer ErrorCode;
  • 但是第一种方法不符合Java的命名规范,所以可以用第二种方法,在属性上添加@JsonProperty注解:
@Data
public class TimResult {
   @JsonProperty(value = "ActionStatus")  
   private String actionStatus;
   @JsonProperty(value = "ErrorInfo")  
   private  String errorInfo;
   @JsonProperty(value = "ErrorCode")  
   private Integer errorCode;

采用上面两种方式不仅在解析json的时候有效,在输出json流的时候同样是以大写字母开头。

ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(Feature.IGNORE_UNKNOWN,true); objectMapper.configure(Feature.WRITE_BIGDECIMAL_AS_PLAIN,true); objectMapper.configure(JsonPa... 面对不遵守驼峰命名规则的接口咋办?当然首先要吐槽一下,不过接口是别人定的,虽然看着不爽但还是得去适配,比如cardNumber,他返回的叫{CARDNUMBER:''}。 通过对API的研究可以通过@JsonProperty以及@JsonAutoDetect来实现。 @JsonAutoDetect(JsonMethod.FIELD) public class Mem... 那么问题来了,如果第二个字母也是大写那么就会有问题,例如kGold的set方法为setKGold时,找到第二个字母发现不是小写,此时就会转换为小写并拼接得到kg后继续向下寻找o之后发现时小写全部拼接old 得到kgold这样其实是没有这个属性的,所以无法成功反序列化这个值,因为一般第一个字母都为大写嘛 第一个字母要转为小写在找之后的字母去拼接,例如setName,转换为name,第一个字母N转换为小写,继续找第二个小写字母,找到之后将其之后的ame全部拼接到n后面得到name。但是具体是什么原因导致的呢。 我们平时调用的接口,可能来自于一个Java服务端,也可能来自于一个NodeJs服务端。如今我们有个小需求:希望在Java服务端中调用NodeJs服务端的接口去做一层代理。主要操作:Java里面将Request封装成普通的JSON串给NodeJs,由NodeJs去做真实的请求。最终得到一个,然后我们再将进行JSON化,返回给Java服务端去反序列化。由于公司框架的某些原因。里面的字段可能都以大写开头或者以小写开头。而Java里面的,每个字段一般都有进行标记。 面对不遵守驼峰命名规则的接口,比如属行首字母大写,这样导致使用Jackson解析出来的对象的属性均为空,经过跟踪源码发现,是由于其根据getters方法解析的属性,属性字母都变为了小写,这就导致无法解析了出现了jackson Unrecognized field 的问题。 @Data public class JobType { private int jobType; 这次开发一个需求的时候, 接口传输时字段首字母大写, jackson默认序列化首字母会小写, 网上有人说用@JsonProperty注解标识字段名, 我试了一下确实可以让字段名大写, 但是必须在get || set方法上再加一个@JsonIgnore注解, 否则最终序列化的结果会出现重复的字段名, 一个首字母大写,一个首字母小写. 但是这种解决方案太麻烦了, 需要在每个字段和字段对应的方法上...       在将实体对象转成json格式返回给前端时,对象的属性名称全是大写的变成小写,其他有大写有小写的却没变。在网上百度一下,可以用@JsonProperty("字段名称")可以解决这个问题。      一开始将 @JsonProperty加在字段名称上,如下图所示: 运行后结果确实不是自己想要的,结果中确实有对象属性名称确实大写了,但问题是小写也会同存在,如下图:  最后发现问题是要 ... web工程中,数据交互是不可避免的,相比xml,json是现在流行的数据交互。 在调试接口中,发现返回字段的大小写不是我所期望的,原本应该返回的nNum字段变成了nnum,这样就导致和前端约定的有出入了。 jackson web工程中,比较流行的框架是springMVC+spring+mybatis。数据交互由springMVC完成,但是springMVC也不是自己序列化json的,它将这个工作交给了jacksonjackson对object进行序列化的过程中确实存在key大写变小写的问题。看我娓