我需要处理bean中引发的异常'干将。默认情况下,如果我的xhtml中有一个像这样的片段:
<h:outputText value="#{bean.someProperty}" />
并且调用方法getSomeProperty()会导致异常,整个页面不会呈现。我需要全局处理这些异常:对于某些异常类,不显示任何代替此h:outputText并正常显示页面的其余部分。或者,至少不呈现页面,而是向用户显示相应的消息。
我尝试通过编写自定义EL解析器来解决此问题:
package package.name;
import javax.el.ELContext;
import javax.el.ELException;
import javax.el.PropertyNotFoundException;
import org.springframework.web.jsf.el.SpringBeanFacesELResolver;
public class MyELResolver extends SpringBeanFacesELResolver {
@Override
public Object getValue(ELContext arg0, Object arg1, Object arg2) throws NullPointerException, PropertyNotFoundException, ELException {
try {
return super.getValue(arg0, arg1, arg2);
} catch (Exception e) {
return null; // TODO
}
}
然后我以这种方式在faces-config.xml文件中注册了它:
<el-resolver>package.name.MyELResolver</el-resolver>
我已经放了两个断点 - 一个在try块中,另一个在catch块中。呈现页面时,会多次访问try块。但是当我想显示一个getter导致异常的bean属性时,没有到达catch块。 Stacktrace包含片段:
Caused by: javax.el.ELException: Error reading 'someProperty' on type my.package.ExampleJSFBean
at javax.el.BeanELResolver.getValue(BeanELResolver.java:98)
这是否意味着,另一个EL解析器已注册?在页面呈现期间调用的getter方法中处理异常的最佳方法是什么?
我使用Spring 3.2.8.RELEASE和Mojara 2.2.10。