版本JFinal4.9
现有代码:
@Override public void configConstant(Constants me) { me.setJsonDatePattern("yyyy-MM-dd"); JFinalJson.setModelAndRecordFieldNameToCamelCase(); me.setJsonFactory(MixedJsonFactory.me()); }
数据库create_time字段类型为datetime,映射的Java model已确认为java.util.Date,以下为BaseXXX的相关代码
public M setCreateTime(java.util.Date createTime) { set("create_time", createTime); return (M)this; } public java.util.Date getCreateTime() { return get("create_time"); }
现象:无论修改me.setJsonDatePattern("yyyy-MM-dd");为什么格式,返回的json字段都是yyyy-MM-dd HH:mm:ss格式
相关源码分析:
JFinalJson
@Override @SuppressWarnings({"rawtypes", "unchecked"}) public String toJson(Object object) { if (object == null) { return "null"; } JsonResult ret = TL.get(); try { // 优先使用对象级的属性 datePattern, 然后才是全局性的 defaultDatePattern String dp = datePattern != null ? datePattern : getDefaultDatePattern(); ret.init(dp, timestampPattern); ToJson toJson = kit.getToJson(object); toJson.toJson(object, convertDepth, ret); return ret.toString(); } finally { ret.clear(); } }
JFinalJsonKit
if (value instanceof java.util.Date) { if (value instanceof Timestamp) { return new TimestampToJson(); } if (value instanceof Time) { return new TimeToJson(); } return new DateToJson(); }
调试:
调试发现createTime被作为Timestamp处理了,而timestampPattern的值目前无法修改,因为MixedJson.getJFinalJson()为private方法,也就没办法获取这个内部实例调用setTimestampPattern()
建议me.setJsonDatePattern("yyyy-MM-dd");的时候同时设置defaultDatePattern和timestampPattern都为这个值,这样子更常用一些,或者退而求其次开放设置JFinalJson.timestampPattern的方法,即修改MixedJson.getJFinalJson()为public方法
JFinalJson.addToJson(Timestamp.class, (v, d, ret) -> {
Timestamp t = (Timestamp)v;
String s = ret.getFormat("yyyy-MM-dd").format(t);
ret.addStrNoEscape(s);
});
由于 Json.java 中并不支持 timestampPattern 配置,所以该配置仅仅是 JFinalJson 内部使用的,所以你当前无法简单地通过配置解决问题
在你不扩展的情况下,只可以临时指令 timestampPattern,例如:
JFinalJson.getJson().setTimestampPattern(...).toJson(...);
上面的临时指定不是全局配置,需要每次都要调用一下那个 setTimestampPattern