Spring使用RestTemplate返回的嵌套实体对象为空,转换json报错

文章讲述了在SpringBoot项目中,使用RestTemplate调用接口时遇到的JSON解析问题,因为TokenUserInfo对象缺少接受空字符串的构造器。给出了两种解决方案:一是为TokenUserInfo添加String类型参数的构造器并使用@NoArgsConstructor和@AllArgsConstructor注解;二是直接接收String结果并手动转换为TokenUser对象。
摘要由CSDN通过智能技术生成

项目场景:

Spring Boot项目使用RestTemplate调用接口,使用嵌套实体对象接收的返回结果

实体对象TokenUser,其中TokenUserInfo是嵌套的对象:

@Data
public class TokenUser {

    private Integer code;

    private TokenUserInfo data;

    private Boolean success;
}
@Data
public class TokenUserInfo {
	
    /**
     * 用户id
     */
    private String userId;
    /**
     * 用户名
     */
    private String userName;
    
}

 使用RestTemplate调用接口

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
 
HttpEntity<String> formEntity= new HttpEntity<>(requestJson, headers);

TokenUser tokenUser = null;
try {
	tokenUser = restTemplate.postForObject(url, formEntity, TokenUser.class);
} catch (Exception e) {
	logger.error("调用接口出错: ", e);
}

问题描述

Spring Boot项目使用RestTemplate调用接口,使用嵌套实体对象接收的返回结果

返回的嵌套对象为null不会有问题

{
    "data": null,
    "success": true,
    "code": 200
}

但是返回的嵌套对象是''空字符串就会报错

{
    "data": "",
    "success": true,
    "code": 200
}

报错详情:

Error while extracting response for type [class com.test.dto.TokenUser] and content type [application/json;charset=UTF-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `com.test.dto.TokenUserInfo` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value (''); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.test.dto.TokenUserInfo` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('')
 at [Source: (PushbackInputStream); line: 1, column: 55] (through reference chain: com.test.dto.TokenUser["data"])

原因分析:

        简单来说就是 json转化成对象失败了,失败的原因是TokenUserInfo对象中虽然有一个构造器,却是全参构造器或是无参构造器,就是缺少一个只有一个String类型参数的构造器,导致在解析 ' ' 空字符串时失败了。


解决方案:

第一种:实体类加上String类型参数的构造器

同时加上@NoArgsConstructor, @AllArgsConstructor 注解,提供无参数的构造函数和全参数的构造函数

@Data
@NoArgsConstructor
@AllArgsConstructor
public class TokenUserInfo {
	
	/**
	 * 防止返回值是空字符串,用string来接收
	 */
	public TokenUserInfo(String userId){
		this.userId = userId;
	}
	
    /**
     * 用户id
     */
    private String userId;
    /**
     * 用户名
     */
    private String userName;
    
}

第二种:用String接收返回结果,再转json对象

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
 
HttpEntity<String> formEntity= new HttpEntity<>(requestJson, headers);

TokenUser tokenUser = null;
try {
	String jsonResult = restTemplate.postForObject(url, formEntity, String.class);
	
	JSONObject userJson = JSON.parseObject(jsonResult);
	tokenUser = JSONObject.toJavaObject(userJson, TokenUser.class);
} catch (Exception e) {
	logger.error("调用接口出错: ", e);
}

我这里用的是alibaba的包

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.44</version>
</dependency>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涛哥是个大帅比

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值