JFinal 如何设置全局500与404错误返回Json

全局404、500跳转在YourJFinalConfig extends JFinalConfig类中的configConstant(Constants me) 方法中配置即可:

me.setError404View("/common/error_404.html");me.setError500View("/common/error_500.html");

但是上面的配置只能跳转到一个界面,现在在写app的后台,希望出现全局404,500时返回一个Json数据,应该如何设置?

评论区

JFinal

2017-06-12 10:42

创建一个public class MyRenderFactory extends RenderFactory,并且覆盖掉其中的 getErrorRender(...) 方法,判断一下 errorCode 为 404 与 500 这两个值,并返回自己的 JsonRender 类就可以了

记得搞定后回来分享一下:http://jfinal.com/share

爪爪

2017-06-12 15:26

这个问题哪位大神实现了吗?我试了好久没实现,能分享一下吗

pfjia

2017-06-12 15:29

@JFinal
上述问题已经解决
分析:

我看了下源码,出现505错误后,错误返回是ActionHandler负责处理,代码如下:
renderManager.getRenderFactory().getErrorRender(500).setContext(request, response, action.getViewPath()).render();
其中getErrorRender(500)调用RenderFactory.getErrorRender(500),代码如下:

public Render getErrorRender(int errorCode) {
return new ErrorRender(errorCode, constants.getErrorView(errorCode));
}

所以我只需要使用MyRenderFactory的实例替代renderManager中的RenderFactory即可,而ActionHandler中的RenderManager代码如下
private static final RenderManager renderManager = RenderManager.me();

RenderManager.me()返回的又是一个常量


所以解决方法如下:

在Config中增加如下代码:
public void configConstant(Constants me) {
//设置全局错误回复
RenderManager.me().setRenderFactory(new MyRenderFactory());
}

MyRenderFactory代码如下:
/**
* 设置500错误返回Json
*/
public class MyRenderFactory extends RenderFactory {
@Override
public Render getErrorRender(int errorCode) {
RespBody respBody = new RespBody();
respBody.setResult(RespBody.Code.ERROR);
if (errorCode == 500) {
return new JsonRender(respBody);
}
return super.getErrorRender(errorCode);
}
}

搞定!

pfjia

2017-06-12 15:30

chenzz

2017-06-12 17:53

RespBody这个是在哪里引入了?在idea里导入不了

chenzz

2017-06-12 18:28

搞定了,我自己定义了一个类,json输出这个类

pfjia

2017-06-13 09:48

@chenzz RespBody是自己定义的一个类,统一返回Json数据格式

王晓辉

2017-12-31 18:00

用的2.2版本的显示 加一个默认构造函数还是有问题,这是咋回事 Implicit super constructor RenderFactory() is not visible for default constructor. Must define an explicit constructor

pfjia

2018-01-02 12:55

@王晓辉 我使用的是jfianl 3.3版本,RenderFactory中有一段被注释的代码,如下

// private static final RenderFactory me = new RenderFactory();
// private RenderFactory() {}

// public static RenderFactory me() {
// return me;
// }

我推测2.2版本中的构造函数是私有的,也即2.2中RenderFactory设计的就是不让开发者继承该类的,不过RenderManager.me().setRenderFactory(new MyRenderFactory());方法的参数是IRenderFacotry而不是RenderFactory,所以有两种方法解决
1.升级jfinal为3.3
2.实现IRenderFactory接口,并且使用代理模式
public class MyRenderFactory implement IRenderFactory{
IRenderFactory rf=RenderFactory.me();
...
}

andy

2019-12-29 15:25

500错误,如何获取error信息呢?

热门反馈

扫码入社