JFinal中有个 Ret 继承HashMap,它没有自己的字段。
public class Result extends HashMap{
private static final long serialVersionUID = 1L;
//状态码
private Integer code = ErrorCodeEnum.OK.getCode();
//后端传给前端的“消息提示”,理论上,前端需要根据状态码code,自己维护给用户的“消息提示”
private String msg;
//数据,可以自定义bean
private Object data;
}
我自己一直喜欢有自己的Result,不继承HashMap,特点是 所有的数据,统一放在Object data中,只有1个字段有数据。
缺点是,如果有2个数据,就需要手动定义1个bean,来容纳这2个。
看了Ret的定义,觉得继承HashMap,也有方便的地方,就参考Ret做了点改造。
最终序列化的时候,前台的json数据是{},但code 肯定有值。
最终查看底层的序列化代码:
如果是Map类型,就强制转换为 Map,但Result除了是个Map,还有自己的字段。
public String toJson(Object object) {
return toJson(object, convertDepth);
}
protected String toJson(Object value, int depth) {
if(value instanceof Map) {
return mapToJson((Map)value, depth);
}
}
bug就这么出现了。
------------------------
从个人代码设计角度,倾向于 数据结构的单一化,要么是个纯粹的Map,要么是个 普通的Bean。
要不然就很容易出现 这种bug,职责不单一导致的。
用setCode的值,存储到父类Map里。
public class Result extends HashMap{
private static final long serialVersionUID = 1L;
//状态码
//private Integer code = ErrorCodeEnum.OK.getCode();
//后端传给前端的“消息提示”,理论上,前端需要根据状态码code,自己维护给用户的“消息提示”
//private String msg;
//数据,可以自定义bean
//private Object data;
public Integer getCode() {
return (Integer) super.get("code");
}
public Result setCode(Integer code) {
super.put("code", code);
return this;
}
而不是定义单独的code字段。
public Result setCode(Integer code) {
this.code=code;
return this;
}
public Integer getCode() {
return code;
}