我们目前正在使用 OmniFaces FullAjaxExceptionHandlerFactory 将应用程序中的任何异常重定向到一般错误页面。然后,此页面检查异常并确定其类型,以便我们可以针对某些已知错误情况显示特定(希望更有帮助)消息。
但是,在某些情况下,我们得到的只是没有附加原因或细节的 PropertyNotFoundException,而不是程序抛出的实际异常。这阻碍了我识别已知错误案例的尝试。
我弄清楚了发生这种情况的情况:我编写了一个复合组件,它封装了一个h:commandLink
. 要传递我使用重定向的操作方法,如下所示:
<cc:attribute name="action" targets="link" required="true" />
因此,
<h:commandLink id="link" value="test" />
这工作正常,但如上所述:如果操作在执行过程中偶然发现异常,则此原始异常将不会被交给错误页面。只有一个 PropertyNotFoundException 出现并告诉我,找不到操作方法 - 没有关于实际问题的任何信息。
我试图以不同的方式传递该方法,例如
<cc:attribute name="bean" required="true" />
<cc:attribute name="method" required="true" />
<cc:attribute name="param" />
和
<h:commandLink id="link"
value="test"
action="#{cc.attrs.bean[cc.attrs.method](cc.attrs.param)}" />
在这种情况下,我得到了正确的异常,但是对于使用页面未传递参数的情况,该方法失败。doSomething()
然后将找不到类似的方法(IllegalArgumentException)。但是,我宁愿在整个应用程序中使用带有或不带参数的一个组件,而不是在此处针对不同的用途强制一些变通方法。
是否有其他方法可以避免重定向方法,或者我们可以更改某些内容,以便重定向方法不会导致无用的 PropertyNotFoundExecption?
编辑:如果可能的话,我更喜欢重定向,因为它对组件的使用限制较少。例如,上述替代方案仅允许具有一个参数的操作。:/