我正在使用 Spring 的 @ExceptionHandler 注释在我的控制器中捕获异常。
当方法的签名中没有参数时,它工作正常(方法被调用),例如
@ExceptionHandler(PortletSessionRequiredException.class)
public void handleExpiredSession() {
log.error("Session is not available.");
}
我的目标是在捕获到异常时进行重定向。但是当我添加一些参数时,例如 HttpServletResponse:
@ExceptionHandler(PortletSessionRequiredException.class)
public void handleExpiredSession(HttpServletResponse response) {
log.error("Session is not available.");
try {
response.sendRedirect("www.example.com");
} catch (IOException e) {
e.printStackTrace();
}
}
调用该方法时出现以下异常:
org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver doResolveException
SEVERE: Invoking request method resulted in exception : public void ...portlet.BaseController.handleExpiredSession(javax.servlet.http.HttpServletResponse)
java.lang.IllegalStateException: Unsupported argument [javax.servlet.http.HttpServletResponse] for @ExceptionHandler method: public void ...portlet.BaseController.handleExpiredSession(javax.servlet.http.HttpServletResponse)
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver.resolveHandlerArguments(AnnotationMethodHandlerExceptionResolver.java:243)
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver.doResolveException(AnnotationMethodHandlerExceptionResolver.java:115)
at org.springframework.web.portlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:129)
at org.springframework.web.portlet.DispatcherPortlet.processHandlerException(DispatcherPortlet.java:1216)
at org.springframework.web.portlet.DispatcherPortlet.doRenderService(DispatcherPortlet.java:784)
at org.springframework.web.portlet.FrameworkPortlet.processRequest(FrameworkPortlet.java:523)
at org.springframework.web.portlet.FrameworkPortlet.doDispatch(FrameworkPortlet.java:471)
at javax.portlet.GenericPortlet.render(GenericPortlet.java:233)
at com.liferay.portlet.FilterChainImpl.doFilter(FilterChainImpl.java:103)
...
根据API, HttpServletResponse 是一个有效的参数。我试过用谷歌搜索它,但关于 ExceptionHandler 的 Unsupported argument exception 的帖子并不多。有人知道为什么它在没有参数的情况下工作,但有参数却不是吗?任何帮助是极大的赞赏。
我正在使用 Spring 3.2.0。
编辑
谢谢,M. Deinum,我还没有意识到我不能使用 HttpServletRequest。现在,当我将其更改为 ActionResponse 时(我相信这是我应该使用的,当我想做重定向时):
@ExceptionHandler(PortletSessionRequiredException.class)
public void handleExpiredSession(ActionResponse response) {
log.error("Session is not available.");
try {
response.sendRedirect("www.example.com");
} catch (IOException e) {
e.printStackTrace();
}
}
我收到以下异常:
org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver doResolveException
SEVERE: Invoking request method resulted in exception : public void ...portlet.BaseController.handleExpiredSession(javax.portlet.ActionResponse)
java.lang.IllegalStateException: Standard argument type [javax.portlet.ActionResponse] resolved to incompatible value of type [class com.liferay.portlet.RenderResponseImpl]. Consider declaring the argument type in a less specific fashion.
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver.resolveCommonArgument(AnnotationMethodHandlerExceptionResolver.java:276)
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver.resolveHandlerArguments(AnnotationMethodHandlerExceptionResolver.java:238)
at org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver.doResolveException(AnnotationMethodHandlerExceptionResolver.java:115)
at org.springframework.web.portlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:129)
at org.springframework.web.portlet.DispatcherPortlet.processHandlerException(DispatcherPortlet.java:1216)
at org.springframework.web.portlet.DispatcherPortlet.doRenderService(DispatcherPortlet.java:784)
at org.springframework.web.portlet.FrameworkPortlet.processRequest(FrameworkPortlet.java:523)
at org.springframework.web.portlet.FrameworkPortlet.doDispatch(FrameworkPortlet.java:471)
at javax.portlet.GenericPortlet.render(GenericPortlet.java:233)
...
我现在做错了什么?