I have a HandlerInterceptorAdapter
that intercepts all requests and performs user authorization checks. Very basically:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
User user = ... // get user
checkIfAuthorized(user); // throws AuthorizationException
return true;
}
I then have an @ExceptionHandler
for that AuthorizationException
.
@ExceptionHandler(value = AuthorizationException.class)
public ResponseEntity<String> handleNotAuthorized(AuthorizationException e) {
// TODO Custom EXCEPTION HANDLER for json/jsp/xml/other types, based on content type
ResponseEntity<String> responseEntity = new ResponseEntity<>("You are not authorized to access that page.", HttpStatus.UNAUTHORIZED);
return responseEntity;
}
This is fine if the (unauthorized) request accepts text/plain
(and can be easily changed for json).
How can I make different @ExceptionHandler
s for specific Accept
headers?
@RequestMapping
has produces()
. Is there something similar for @ExceptionHandler
?
I know this comes late but I've been looking up a solution to this, came across this question and found what I think to be a better solution. You can return "forward:/error" in your @ExceptionHandler (returning a String) to forward the request to a
@RequestMapping("/error")
ErrorController {...}
and use
@RequestMapping(produces = "text/html")
ModelAndView errorPage() {...}
on one method of that ErrorController,
@RequestMapping(produces = "application/json") // or no 'produces' attribute for a default
MyJsonObject errorJson() {...} on another.
I think this is a pretty neat way to do it, it's probably already out there but I didn't find it when trying to look it up.
So basically the @ExceptionHandler is the same for all, but forwards to a controller that can do the usual stuff
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With