Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @ExceptionHandler不支持的参数_Java_Spring_Spring Mvc_Exceptionhandler - Fatal编程技术网

Java @ExceptionHandler不支持的参数

Java @ExceptionHandler不支持的参数,java,spring,spring-mvc,exceptionhandler,Java,Spring,Spring Mvc,Exceptionhandler,我正在使用Spring的@ExceptionHandler注释捕获控制器中的异常 当方法的签名中没有参数时,它工作正常(方法被调用),例如 我的目标是在捕获异常时执行重定向。但当我添加一些参数时,例如HttpServletResponse: @ExceptionHandler(PortletSessionRequiredException.class) public void handleExpiredSession(HttpServletResponse response) { log

我正在使用Spring的@ExceptionHandler注释捕获控制器中的异常

当方法的签名中没有参数时,它工作正常(方法被调用),例如

我的目标是在捕获异常时执行重定向。但当我添加一些参数时,例如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)
    ...
根据,HttpServletResponse是一个有效的参数。 我试着用谷歌搜索它,但是关于ExceptionHandler的不受支持的参数异常的帖子并不多。有人知道为什么它在没有争论的情况下工作,但在有争论的情况下却不行吗?非常感谢您的帮助

我正在使用Spring3.2.0

编辑

谢谢,迪纳姆先生,我还没有意识到我不能使用HttpServletRequest。现在,当我将其更改为ActionResponse(我相信这是我应该使用的,当我想重定向时):

我遇到了以下异常:

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)
    ...

我现在做错了什么?

您所处的环境是portlet环境,而不是servlet环境。因此,您有一个
PortletRequest
而不是
HttpServletRequest
@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)
    ...