allow for writing the response directly in a Portlet @ExceptionHandler method (like in the Servlet equivalent)

This commit is contained in:
Juergen Hoeller 2010-09-06 21:43:26 +00:00
parent 66b4499973
commit 45d9b0cb2d
3 changed files with 35 additions and 7 deletions

View File

@ -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.
* <p>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.
* <p>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);

View File

@ -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");

View File

@ -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