Reputation: 14540
ExceptionHandler can return ModelAndView, Model, Map etc. Is it possible to return an object of my own type and register some transformer that can convert my type to one of types understood by Spring? For example:
@ExceptionHandler
public MyType handle(Exception e) {
...
}
@SomeTransformer
public Map convert(MyType myObject) {
...
}
Upvotes: 1
Views: 442
Reputation: 15109
Of course you could also do what you want to by using an aspectj
after advice.
private pointcut transformer() : execution(@SomeTransformer * *(..));
after() returning (Object o): transformer() {
System.out.println("I'd like to transform this object " + o);
}
But.. I don't know why you'd ever want to do that.. ?
DISCLAIMER: This is untested.
Upvotes: 1
Reputation: 6408
ExceptionHandler methods obey the same contract that Controller methods follow. Here's a listing of all supported return types for Spring MVC controller methods in Spring 3.1. Bullet #7 would be of most interest to you.
The relevant portion:
16.3.3.2 Supported method return types
The following are the supported return types:
A ModelAndView object, with the model implicitly enriched with command objects and the results of @ModelAttribute annotated reference data accessor methods.
A Model object, with the view name implicitly determined through a RequestToViewNameTranslator and the model implicitly enriched with command objects and the results of @ModelAttribute annotated reference data accessor methods.
A Map object for exposing a model, with the view name implicitly determined through a RequestToViewNameTranslator and the model implicitly enriched with command objects and the results of @ModelAttribute annotated reference data accessor methods.
A View object, with the model implicitly determined through command objects and @ModelAttribute annotated reference data accessor methods. The handler method may also programmatically enrich the model by declaring a Model argument (see above).
A String value that is interpreted as the logical view name, with the model implicitly determined through command objects and @ModelAttribute annotated reference data accessor methods. The handler method may also programmatically enrich the model by declaring a Model argument (see above).
void if the method handles the response itself (by writing the response content directly, declaring an argument of type ServletResponse / HttpServletResponse for that purpose) or if the view name is supposed to be implicitly determined through a RequestToViewNameTranslator (not declaring a response argument in the handler method signature).
If the method is annotated with @ResponseBody, the return type is written to the response HTTP body. The return value will be converted to the declared method argument type using HttpMessageConverters. See Section 16.3.3.5, “Mapping the response body with the @ResponseBody annotation”.
A HttpEntity or ResponseEntity object to provide access to the Servlet response HTTP headers and contents. The entity body will be converted to the response stream using HttpMessageConverters. See Section 16.3.3.6, “Using HttpEntity”.
Any other return type is considered to be a single model attribute to be exposed to the view, using the attribute name specified through @ModelAttribute at the method level (or the default attribute name based on the return type class name). The model is implicitly enriched with command objects and the results of @ModelAttribute annotated reference data accessor methods.
Upvotes: 1