SpringBoot集成Beetl后如果页面出现异常会将出现异常之前的页面输出到客户端,但是由于页面不完整会导致用户看到的页面错乱或者空白,如下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 复制代码
在控制台可以看到
>>11:11:47:该方法未注册(FUNCTION_NOT_FOUND):err 位于8行 资源:modular/sys/login/login.html 5| <title>Title</title> 6|</head> 7|<body> 8| ${err()} 9|</body> 10|</html> 复制代码
我们一般希望当出现异常时返回异常提示页面而不是不完整的页面。
Beetl默认发生页面异常时不对异常进行抛出,在文档中我们可以看到
2.2.3版本以后,新增加org.beetl.ext.web.WebErrorHandler,可以在web开发的时候在页面输出提示信息,在产品模式下在后台输出提示信息(通过配置属性ESOURCE.autoCheck= true来认为是开发模式),仅仅需要配置如下: ERROR_HANDLER = org.beetl.ext.web.WebErrorHandler
所以这里设置 ErrorHandler
,使用Beetl提供的 org.beetl.ext.web.WebErrorHandler
BeetlConfiguration beetlConfiguration = new BeetlConfiguration(); beetlConfiguration.setErrorHandler(new WebErrorHandler()); 复制代码
再次访问页面可以看到页面中显示了调用栈
在实际应用中,开发环境我们希望看到异常信息,生产环境希望看到的是统一的异常提示页面,而不是用户看不懂的代码信息,在 org.beetl.ext.web.WebErrorHandler
中可以看到
//判断是不是开发者模式,如果不是调用父类方法(默认输出控制台) if (!Boolean.valueOf(e.gt.getConf().getProperty("RESOURCE.autoCheck"))){ super.processExcption(e, writer); } 复制代码
这里通过配置属性ESOURCE.autoCheck= true来认为是开发模式,但是通过 BeetlConfiguration.setConfigProperties
设置 ESOURCE.autoCheck=false
后依然无效(模板不会热加载,但是这边依旧当做开发环境),也有可能是我设置不对的原因。 所以通过自定义 WebErrorHandler
解决此问题,通过判断 spring.spring.active
去判断当前环境;也可以抛出异常到全局异常统一处理。