我们目前正在使用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?
编辑:如果可能的话,我更喜欢重新定位,因为它对使用该组件的限制较少。例如,上述替代方案仅允许具有一个参数的动作。 :/
答案 0 :(得分:0)
根据评论,这是一个已知的Mojarra问题。我们升级到Mojarra 2.1.21并且我可以确认此版本中的问题是已修复的,并且异常最终会在接口中以纯粹的方式结束,并且不会像代码那样保持不变;)
感谢您的帮助!