建议JFinal的Action 参数注入支持application/json

一直以来社区都有大量用户问前端穿过来的json数据怎么接收,作者一直都是建议大家使用HttpKit.readData(getRequest());的方式自己去做解析映射到map,再使用map.get("xxx")获取,这些都太重复单调了,完全可以从框架底层Action 参数注入支持。

通过request的content-type获取是否是json类型,在通过@Para("user.name") String name的方式取值,对于顶层的json可以免@Para注解直接映射变量名,比如json体为 {"username":"abc","password":"123456"},可以直接通过String username,String password取值,对于复杂的则通过@Para("user.name") String name的方式取值


题外话:

一直以来JFinal都使开发效率提升了一大截,但是隔壁SpringBoot社区也蓬勃发展着,个人觉得有必要再持续优化开发效率,优化一些实际常用场景,而非只提供通用场景,比如SpringBoot对于Db操作都已经支持selectOne了,而JFinal只提供了selectById和selectFirst(需写sql),实际业务来说就有很多通过某些字段查询单条记录的情况,比如findByUsername,findByMobile,findByToken,实现思路作者可以提供一个findOne(String field,Object value)或者findOne(Map map)或者findOne(Object... fieldvalues),fieldvalues为field,value,field,value...形式

评论区

xialinlin

2020-07-24 08:47

可以参考一下 jboot Db 增强这一块

久伴轻尘

2020-07-24 09:04

在获取参数这一块我更喜欢波总这种方式,重复性的工作你可以让他不重复,只是自己多写几行代码的事,波总早有提供getRawData()这个方法,你可以自己写个baseController来处理这里转成 Record 或者你想要的bean,这样比你那个注解应该是简单多了的

chcode

2020-07-24 09:47

https://jfinal.com/share/1918

JFinal

2020-07-24 12:08

做到 jfinal 内部,可能会失掉一些通用性,所以暂时建议扩展一下,起码有如下方式扩展,任选其一:
1:通过实现 com.jfinal.core.paragetter.ParaGetter.java 这个接口扩展一个支持 json 的类,例如:
public class JsonMapGetter extends ParaGetter {
public JsonMapGetter(String parameterName, String defaultValue) {
super(parameterName, defaultValue);
}

public T get(Action action, Controller c) {
return to(c.getRawData());
}

protected T to(String v) {
return v != null ? FastJson.getJson().parse(v, Map.class): "null";
}
}

然后注册一下:
ParaProcessorBuilder.me.regist(Map.class, JsonMapGetter.class, null);

用的时候这样:
public class MyController extends Controller {
public void index(Map jsonMap) {
...
}
}

上面的扩展可以将 json 数据转成 Map 类型,你希望支持哪种类型就像上面的这样扩展,当然,上面的扩展还可以更更完善,例如在 get(Action, Controller) 方法中判断当前请求是否为 application/json, 分情况采取不同的处理方式会更灵活

2: 通过引入一个public class BaseController extends Controller, 在其中添加一些你常用到的 getXxx 方法,转成希望的类型,配合 getRawData() 可以很方便获取 json 数据

Ghai、海

2020-07-24 18:47

https://jfinal.com/share/1350

registernet

2020-08-01 18:17

@Ghai、海 这个太复杂,还是前面 @JFinal 说的继承ParaGetter比较合理,并且也比较简单.