在Freemarker页面中如果使用${userName},并且userName为空,那么Freemarker页面就会崩掉 需要设置默认值${userName!}来避免对象为空的错误。
同理 ${user.userName}也应该写成这样${(user.userName)!""}现在有一个需求,就是万一我用了${userName},但是我又不想页面崩掉,怎么办呢?
我们先来看一下一个程序启动,到一个请求过来的过程:
Freemarker与Web容器无关,web项目中的异常处理(@ControllerAdvice)只处理web请求,经由controller引发的异常,无法处理freemarker的异常,为了不让ftl页面再出现“乱码”错误,即使出现freemarker语法或者判断错误,还可以继续解析下面的内容。
FreemarkerConfiguration添加:
@PostConstruct
public void setSharedVariable() {
freemarkerTemplateConfiguration.setTemplateExceptionHandler(new MyTemplateExceptionHandler());
}
MyTemplateExceptionHandler定义:
@Component
public class MyTemplateExceptionHandler implements TemplateExceptionHandler {
private static Logger logger = LoggerFactory.getLogger(MyTemplateExceptionHandler.class);
@Override
public void handleTemplateException(TemplateException templateException, Environment environment, Writer out) {
logger.error(templateException.getMessage());
}
}
这样即使ftl解析错误,比如某个变量没有定义,可以忽略,只是后台抛异常,然后整个页面还是会渲染出来还会继续解析页面,提高项目处理异常的健壮性。