开启接收json数据后,自定义的handel如何去获取jsonRequest对象

if (resolveJson && controller.isJsonRequest()) {
    // 注入 JsonRequest 包装对象接管 request
    controller.setHttpServletRequest(jsonRequestFactory.apply(controller.getRawData(), controller.getRequest()));
}

这地方直接截胡了。。

之前使用的自定义handel无法通过request去获取params

public class RequestContextHandler extends Handler {

    @Override
    public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
        try {
            RequestContext.handle(request, response);
            doHandle(target, request, response, isHandled);
        } finally {
            RequestContext.release();
        }

    }

    private void doHandle(String target, HttpServletRequest request, HttpServletResponse response,
            boolean[] isHandled) {
        request.setAttribute(CommonConsts.attrRequest, request);
        next.handle(target, request, response, isHandled);
    }
}

无法使用ThreadLocal存放了。。

private static ThreadLocal<HttpServletRequest> requests = new ThreadLocal<>();


评论区

Leo.du

2023-08-13 16:43

@杜福忠 大牛,有办法解决吗?

杜福忠

2023-08-13 17:47

@Leo.du 执行ActionHandler 的时候 才创建 JsonRequest对象,自定义的 Handler 是在ActionHandler 之前执行的,所以是拿不到的。

需求分析:根据你业务需求,是要获取 JsonRequest ,并且是 Handler 级的获取。
简单方案:创建JsonRequest 的时候,获取该对象,因为ActionHandler 支持setJsonRequestFactory。代码大致如下:JFinalConfig的子类》
public void configConstant(Constants me) {
me.setResolveJsonRequest(true);
me.setJsonRequestFactory((jsonString, req) -> {
JsonRequest ret = new JsonRequest(jsonString, req);
// 在这里 获取到这个对象
return ret;
});
}

复杂点方案:自定义ActionHandler,继承ActionHandler,复制里面代码,改为自己业务的,再配置:
public void configHandler(Handlers me) {
me.setActionHandler(...)
}

Leo.du

2023-08-13 20:57

@杜福忠 OK,谢了,我试试

热门反馈

扫码入社