所以我有一个我正在研究的Struts2应用程序。在我的首页上,我有一个部分将显示我的应用程序抛出的任何异常。这很有效,直到我添加了一个自定义拦截器。
这是我的拦截器代码:
public String intercept(ActionInvocation actionInvocation) throws Exception {
String result = actionInvocation.invoke();
return result;
}
这是我的Action类中生成异常的代码,它发生在调用AuthService.Authorize()的位置:
if(AuthService.Authorize(username, password)) {
if(AuthService.AdminAuthorized()) {
return "admin";
}
return SUCCESS;
}
这是在AuthService.Authorize()内部,它在访问acc时抛出一个空点异常:
try {
acc = profileRepository.WhereSingle("Username", "=", username);
} catch (Exception e) {
return false;
}
if (acc.Password.equals(password)) {
但是,页面加载时。这不是填充的:
<s:property value="%{exception.message}"/>
我测试了它,如果我只是从Action类中抛出一个异常,它就可以工作了。我没有调用redirectAction或其他任何东西
这是我的所有其他包扩展的默认包定义的顶部
<package name="default" namespace="/" extends="struts-default">
<!-- Interceptors -->
<interceptors>
<interceptor name="conversation" class="global.ConversationInterceptor"/>
<interceptor-stack name="dils-stack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="conversation"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="dils-stack"/>
<global-results>
<result name="Exception" >/index.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="Exception"/>
<exception-mapping exception="java.lang.NullPointerException" result="Exception"/>
</global-exception-mappings>
答案 0 :(得分:1)
如何为该操作定义拦截器堆栈?应首先在堆栈中定义ExceptionMappingInterceptor
。你可以从struts.xml发布拦截器堆栈配置吗?你的自定义拦截器不应该干扰(它什么都不做)。
<强>更新强>
我能够重现这个问题,但无论你有没有你的自定义拦截器,它都会发生。
原因是您正在专门查找异常消息,该消息未设置为自动抛出的NullPointerException
(如您的情况)。您可以通过显示堆栈跟踪来确认,例如:%{exceptionStack}
%{exception.message}
, NullPointerException
为空,因此它不显示任何内容。如果您要通过消息(例如throw new RuntimeException("OMG!");
)抛出异常,那么您将看到该消息。
另请注意,必须在struts.xml中的特定映射较少之前指定更具体的异常映射。由于NullPointerException
比Exception
更具体,因此您必须先列出它。请注意,这在您的示例中并不重要,因为它们映射到同一个东西。只要知道你的NPE将映射到第一个条目,而不是第二个条目。