1

我正在使用 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)
    ...

我现在做错了什么?

4

0 回答 0