自定义返回数据类型前台响应json数据没有属性值
浅浅记录一下日常踩坑。 — — !
一、问题起因
自定义了一个返回数据类型,通过Controller控制层 返回自定义类型数据时,前台获取不到返回数据,显示为‘{ }’
- 自定义的返回数据类
package cn.zhidasifang.camundaproject.utils;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import java.io.Serializable;
/**
* @Description: 统一返回参数类型
* @ClassName: ResultUtils
*/
@Data
public class ApiResult<T> extends JSONObject implements Serializable {
private static final long serialVersionUID = 411731814484355577L;
/**
* 状态码
* */
private int code;
/**
* 提示信息
* */
private String msg;
/**
* 相关数据
* */
private T data;
@Override
public String toString() {
return "ApiResult{" +
"code=" + code +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
private ApiResult(int code, String msg){
this.code = code;
this.msg = msg;
}
private ApiResult(int code, String msg, T data){
this.code =code;
this.msg = msg;
this.data = data;
}
/**
* 成功构造器
* */
public static <T> ApiResult<T> success(){
return new ApiResult<>(ResultCodeEnum.SUCCESS.getCode(),ResultCodeEnum.SUCCESS.getMessage());
}
public static <T> ApiResult<T> success(String message){
return new ApiResult<>(ResultCodeEnum.SUCCESS.getCode(),message);
}
public static <T> ApiResult<T> success(T data){
return new ApiResult<>(ResultCodeEnum.SUCCESS.getCode(),ResultCodeEnum.SUCCESS.getMessage(),data);
}
public static <T> ApiResult<T> success(String msg, T data){
return new ApiResult<>(ResultCodeEnum.SUCCESS.getCode(),msg,data);
}
/**
* 失败构造器
* */
public static <T> ApiResult<T> fail(){
return new ApiResult<>(ResultCodeEnum.FAIL.getCode(),ResultCodeEnum.FAIL.getMessage());
}
public static <T> ApiResult<T> fail(String msg){
return new ApiResult<>(ResultCodeEnum.FAIL.getCode(),msg);
}
public static <T> ApiResult<T> fail(T data){
return new ApiResult<>(ResultCodeEnum.FAIL.getCode(),ResultCodeEnum.FAIL.getMessage(),data);
}
public static <T> ApiResult<T> fail(String msg , T data){
return new ApiResult<>(ResultCodeEnum.FAIL.getCode(),msg,data);
}
}
- 控制层Controller代码实例
@ResponseBody
@PostMapping(value = "/test")
public ApiResult resultTest(){
/*类型一 HashMap 正常*/
HashMap<String, Object> map = new HashMap<>();
map.put("1","ll");
map.put("2","xx");
map.put("3","fff");
System.out.println("map = " + map);
/*类型二 自定义对象 正常*/
TaskVo taskVo = new TaskVo();
taskVo.setId("123");
taskVo.setName("流程");
taskVo.setProcessInstanceId("xxxxx");
System.out.println("taskVo = " + taskVo);
/*类型三 自定义返回类型2(含泛型)--响应无数据*/
ApiResult<Object> success = ApiResult.success("成功",map);
System.out.println("success = " + success);
System.out.println("success.getData() = " + success.getData());
return success;
}
/**
输出的结果都是正常的!!!!
map = {1=ll, 2=xx, 3=fff}
taskVo = TaskVo(id=123, name=流程, processInstanceId=xxxxx)
success = ApiResult{code=0, msg='成功', data={1=ll, 2=xx, 3=fff}}
success.getData() = {1=ll, 2=xx, 3=fff}
*/
在返回类型设置为 HashMap 和 自定义其他类 时,前台都能正常获取到响应结果的Json类型数据,但是在使用自定义的响应数据类型时,前台显示的数据就是没有对应的属性值!!!
返回自定义返回类型数据时,前台响应结果如下图所示:
二、问题原因
当返回结果内容打印正常,但是在前台显示不出属性(Key / Value)的情况。目前我检测出来两种原因。
-
原因一:
当我们自定义一个返回数据类型时,如果该实体类中的属性 没有设置对应属性的 get/set方法,这就导致在序列化对应属性值时取不到对应的属性值,所有在响应结果中,就不会出现对应的属性值字段。
-
原因二:
自定义返回数据类型继承了 JSONObject 接口!!!(我出现的这种错误),就会导致自定义数据类型在响应到前台时,不会显示出任何属性值!
这种方式导致的原因还待追溯,目前尚不明确是为什么!!