Похоже, что у вас есть большинство ответов на ваш вопрос:)
Чтобы повторить,
У контроллера вот так
@RequestMapping("/test")
public String verifyAuth(HttpServletRequest request) throws NotFoundException {
String id = request.getParameter("id");
if (id == null)
throw new NotFoundException("Id not found in the request");
return "success";
}
Объявите класс исключений в NotFoundException.java,
@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Id Not Found")
public class NotFoundException extends Exception {
public NotFoundException(String msg) {
super(msg);
}
}
Этот класс исключений не обязательно должен быть каждым классом контроллера. Объявите его как открытый класс и импортируйте его в каждый требуемый контроллер.
Это один из способов сделать это. Если вам нравится стиль, отличный от Spring, объявите HttpServletResponse в аргументах каждого контроллера и выполните
@RequestMapping("/test")
public String verifyAuth(HttpServletRequest request, HttpServletResponse response) {
...
try {
response.sendError(..)
catch(..) {}
}
Или вы можете использовать представления для отображения сообщения об ошибке,
@RequestMapping("/test")
public String verifyAuth(HttpServletRequest request, Map<String, Object> map){
String id = request.getParameter("id");
if (id == null) {
map.put("status", HttpStatus.NOTFOUND);
map.put("reason", "Id Not Found");
return "error"
}
return "success";
}
Убедитесь, что ваш viewResolver настроен правильно, и вы можете сказать, что в файле error.jsp для получения строки ошибки.
<body>
${status} ${reason}
</body>
Определите error.jsp с хорошим css для всех возможных ошибок.
Это не единственные способы. С весной у тебя есть свобода делать что угодно. Я видел несколько ppl рендеринга объекта json для сообщения об ошибке.
Ответ на ваш другой вопрос о том, произошла ли ошибка в службе, вызываемой контроллером, зависит от вашего сценария. Например, вы пытаетесь прочитать хранилище пользователя, если возникает ошибка недоступности хранилища пользователя, я бы обработал сам себя для чтения из другого хранилища пользователей реплики, если оно доступно, и если я обнаружил, что пользователь не существует, я бы оставил исключение для контроллер бросить.