Spring Exception message?Что это? - PullRequest
       8

Spring Exception message?Что это?

2 голосов
/ 13 февраля 2011

Я думаю, что этот вопрос является общим для исключений, но давайте использовать мой пример.

У меня есть следующий простой контроллер для домашней страницы пользователя после успешного входа в систему.

@Controller
@RequestMapping("/user-home")
public class UserHomeController {

    private static Log log = LogFactory.getLog(UserHomeController.class);

    @RequestMapping(method = RequestMethod.GET)
    public String getUserHome(HttpServletRequest request) {

        if (request.getSession(false) == null) {
            throw new UnauthorizedClientException("Could not authenticate request. There is no session present for this request.");
        } else {
            return "user_home";
        }
    }

    @ResponseStatus(HttpStatus.NOT_FOUND)
    @ExceptionHandler({UnauthorizedClientException.class})
    public void handle404() {
        log.info("An UnauthorizedClientException was thrown inside UserHomeController.");
    }
}

Итак, это работает, то есть я получаю страницу 404 по умолчанию, когда сеанс отсутствует, но сообщение, которое я передал в UnauthorizedClientException, нигде не найдено. Страница 404 имеет «Сообщение:», после которого ничего нет.

Куда делось мое сообщение? Какова цель сообщения, передаваемого конструктору исключения?

Ответы [ 3 ]

4 голосов
/ 13 февраля 2011

Вы неправильно понимаете, для чего UnauthorizedClientException.Она не предназначена для отображения страницы для вас, она просто предназначена для внутреннего контроля.

Когда вы генерируете это исключение, Spring перехватывает его и передает его методу handle404().Этот метод, в свою очередь, отвечает за обработку исключения соответствующим образом.Методы, помеченные как

@ExceptionHandler, ведут себя почти так же, как и методы @RequestMapping.Это означает, что они должны возвращать представления и модели, если случится что-то полезное.

Однако все, что делает ваш метод, - записывает сообщение об исключении во внутренний регистратор и возвращает его.Он не возвращает представление, и поэтому ничто не обрабатывается, за исключением страницы ошибки по умолчанию;и он не возвращает модель, поэтому сообщение не отображается.

Вам необходимо изменить метод handle404() на (a) вернуть имя JSP, которое вы хотите визуализировать, и (b) добавитьсоответствующее сообщение модели.

1 голос
/ 13 февраля 2011

Как насчет того, чтобы сделать что-то подобное?

@ExceptionHandler(UnauthorizedClientException.class)
public ModelAndView handle404(UnauthorizedClientException exception) {
    ModelAndView modelAndView = new ModelAndView("/errors/404");
    modelAndView.addObject("message", exception.getMessage());
    return modelAndView;
}

Таким образом, вы можете установить сообщение из исключения и отобразить его на отформатированной странице ошибок 404.

0 голосов
/ 13 февраля 2011
@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler({UnauthorizedClientException.class})
public void handle404() {

Значит ли это, что если у вас есть 404 и другой класс исключений, ваш обработчик не будет вызван?Что произойдет, если вы удалите аннотацию @ExceptionHandler?

Мне бы предложили получить 404 за другого, если ваш обработчик вызывается после этого изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...