diff --git a/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/mvc/annotation/AnnotationMethodHandlerExceptionResolver.java b/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/mvc/annotation/AnnotationMethodHandlerExceptionResolver.java index 3b76a9a33dc2fee78cda4c238eb0d4478d14fd17..a07cc14e4d1f773f6c8ede0f542747cd464df94b 100644 --- a/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/mvc/annotation/AnnotationMethodHandlerExceptionResolver.java +++ b/org.springframework.web.portlet/src/main/java/org/springframework/web/portlet/mvc/annotation/AnnotationMethodHandlerExceptionResolver.java @@ -74,16 +74,18 @@ public class AnnotationMethodHandlerExceptionResolver extends AbstractHandlerExc /** - * Set a custom ArgumentResolvers to use for special method parameter types. Such a custom ArgumentResolver will kick - * in first, having a chance to resolve an argument value before the standard argument handling kicks in. + * Set a custom ArgumentResolvers to use for special method parameter types. + *
Such a custom ArgumentResolver will kick in first, having a chance to resolve + * an argument value before the standard argument handling kicks in. */ public void setCustomArgumentResolver(WebArgumentResolver argumentResolver) { this.customArgumentResolvers = new WebArgumentResolver[]{argumentResolver}; } /** - * Set one or more custom ArgumentResolvers to use for special method parameter types. Any such custom ArgumentResolver - * will kick in first, having a chance to resolve an argument value before the standard argument handling kicks in. + * Set one or more custom ArgumentResolvers to use for special method parameter types. + *
Any such custom ArgumentResolver will kick in first, having a chance to resolve + * an argument value before the standard argument handling kicks in. */ public void setCustomArgumentResolvers(WebArgumentResolver[] argumentResolvers) { this.customArgumentResolvers = argumentResolvers; @@ -366,7 +368,7 @@ public class AnnotationMethodHandlerExceptionResolver extends AbstractHandlerExc return new ModelAndView((String) returnValue); } else if (returnValue == null) { - return null; + return new ModelAndView(); } else { throw new IllegalArgumentException("Invalid handler method return value: " + returnValue); diff --git a/org.springframework.web.portlet/src/test/java/org/springframework/web/portlet/mvc/annotation/Portlet20AnnotationControllerTests.java b/org.springframework.web.portlet/src/test/java/org/springframework/web/portlet/mvc/annotation/Portlet20AnnotationControllerTests.java index 2ecd287cd69ec19a7616b9c7e8f5332b313d1d83..a53494e6e6249d79e04f57d812dc7fa9c18fd4b8 100644 --- a/org.springframework.web.portlet/src/test/java/org/springframework/web/portlet/mvc/annotation/Portlet20AnnotationControllerTests.java +++ b/org.springframework.web.portlet/src/test/java/org/springframework/web/portlet/mvc/annotation/Portlet20AnnotationControllerTests.java @@ -86,7 +86,6 @@ import org.springframework.web.context.request.WebRequest; import org.springframework.web.context.support.GenericWebApplicationContext; import org.springframework.web.portlet.DispatcherPortlet; import org.springframework.web.portlet.ModelAndView; -import org.springframework.web.portlet.bind.MissingPortletRequestParameterException; import org.springframework.web.portlet.bind.annotation.ActionMapping; import org.springframework.web.portlet.bind.annotation.EventMapping; import org.springframework.web.portlet.bind.annotation.RenderMapping; @@ -519,6 +518,17 @@ public class Portlet20AnnotationControllerTests { portlet.render(request, response); assertEquals("myLargeView-value2", response.getContentAsString()); + actionRequest = new MockActionRequest("error"); + actionResponse = new MockActionResponse(); + portlet.processAction(actionRequest, actionResponse); + + request = new MockRenderRequest(PortletMode.VIEW, WindowState.MAXIMIZED); + request.setParameters(actionResponse.getRenderParameterMap()); + request.setSession(actionRequest.getPortletSession()); + response = new MockRenderResponse(); + portlet.render(request, response); + assertEquals("XXX", response.getContentAsString()); + MockEventRequest eventRequest = new MockEventRequest(new MockEvent("event1")); MockEventResponse eventResponse = new MockEventResponse(); portlet.processEvent(eventRequest, eventResponse); @@ -1029,6 +1039,11 @@ public class Portlet20AnnotationControllerTests { response.setRenderParameter("test", "value2"); } + @ActionMapping("error") + public void myError(StateAwareResponse response) { + throw new IllegalStateException("XXX"); + } + @EventMapping("event1") public void myHandle(EventResponse response) throws IOException { response.setRenderParameter("test", "value3"); @@ -1049,6 +1064,11 @@ public class Portlet20AnnotationControllerTests { writer.write("myView"); } + @ExceptionHandler + public void handleException(Exception ex, Writer writer) throws IOException { + writer.write(ex.getMessage()); + } + @ResourceMapping("resource1") public void myResource(Writer writer) throws IOException { writer.write("myResource"); diff --git a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java index aceec7aa11877e2fc77a76eaa4368c0f738d05ee..f8d652f4c0beffe6797c6dcf3b9767cba30595ed 100644 --- a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java +++ b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java @@ -114,6 +114,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.SessionAttributes; +import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.support.ConfigurableWebBindingInitializer; import org.springframework.web.bind.support.WebArgumentResolver; import org.springframework.web.bind.support.WebBindingInitializer; @@ -1769,13 +1770,18 @@ public class ServletAnnotationControllerTests { @RequestMapping("") public void myPath2(HttpServletResponse response) throws IOException { - response.getWriter().write("test"); + throw new IllegalStateException("test"); } @RequestMapping("/bar") public void myPath3(HttpServletResponse response) throws IOException { response.getWriter().write("testX"); } + + @ExceptionHandler + public void myPath2(Exception ex, HttpServletResponse response) throws IOException { + response.getWriter().write(ex.getMessage()); + } } @Controller