2014-01-22 6 views
1

У меня есть контроллер, который использует весеннюю проверку боба для проверки входных значений, например, чтобы сохранить тему:Spring ExceptionHandler доступ к модели?

public String save(@ModelAttribute("topic") @Valid Topic topic 

Это работает хорошо.

В моем слое данных я также использую проверку бина и когда что-то недействительное отправляется на слой данных, генерируется исключение ConstraintViolationException. Я поймаю это в своем контроллере с помощью обработчика исключения:

@ExceptionHandler({ ConstraintViolationException.class }) 
public ModelAndView handleValidationException(HttpServletRequest req,ConstraintViolationException e) { 

Это также хорошо работает.

Проблема я столкнулся это я не могу получить доступ к модели в моем ExceptionHandler, Документах ясно говорит об этом:

Important Note: the Model may not be a parameter of any @ExceptionHandler method. 

Доступ к модели необходим, потому что я хочу, чтобы показать пользователю представление с формой, которую он только что заполнил. Но поскольку я не могу получить доступ к модели, я не могу получить заполненные данные формы.

Одно решение, которое я нашел, ломает ConstraintViolationException в моем методе save(), потому что здесь у меня есть доступ к модели.

Но я бы предпочел универсальное решение и не имел беспорядочную попытку/улов/наконец, когда мне нужно что-то сохранить в базе данных.

Кто-нибудь знает хорошее решение?

[править] Вот мой текущий обработчик исключений:

@ExceptionHandler({ ConstraintViolationException.class }) 
public ModelAndView handleValidationException(HttpServletRequest req,ConstraintViolationException e) { 
log.debug("handleValidationException"); 

//no access to model, so i create new one, but this new one doesn't have the values the user entered in the html form. 

ModelAndView mav = new ModelAndView(); 
mav.addObject("exception", e); 
mav.setViewName("add_topc"); 
return mav; 
} 
+0

Можем ли мы увидеть, что ваш '@ ExceptionHandler' делает? Объект 'Тема' уже должен находиться в модели. –

+0

Я добавил обработчик исключений к вопросу.Как написано в документах и ​​отмечено в моем вопросе «Модель не может быть параметром любого метода @ExceptionHandler». Если я понимаю, что объект Topic недоступен в обработчике исключения, то модель, содержащая объект Topic, недоступна в обработчике исключений. – TinusSky

+0

Есть ли что-нибудь, что вы хотите сделать для фактического объекта 'Тема'? «ModelAndView», который вы возвращаете из '@ ExceptionHandler', будет объединен с« Моделью », которую использовал ваш обработчик' @ Controller'. –

ответ

0

После некоторых мыслей на эту тему я пришел к выводу, что одна страница ошибки отображения ошибки достаточно. В основном потому, что ошибки, возникающие на уровне данных, являются фатальными ошибками, которые пользователь не может исправить, например, изменив значения полей. Разумеется, было бы неплохо отобразить страницу с ошибкой в ​​контексте того, где все пошло не так, и сохранить вход пользователей. Но это не похоже на весну.

0

Немного старый, но я оказался в подобной ситуации.

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

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

SNIPET от контроллера

... 
throw new ConstraintViolationException(model); 

SNIPET из ModelAwareException

public void ConstraintViolationException(Model saveModel) { 
    this.model = saveModel; 
} 

SNIPET из ExceptionHandler

@ExceptionHandler({ ConstraintViolationException.class }) 
public ModelAndView handleValidationException(HttpServletRequest req,ConstraintViolationException e, Model unpopulatedSpringModel) { 

    unpopulatedSpringModel = e.getModel(); 
    return new ModelAndView("yourpage"); 

} 
+1

Добавьте образец кода, если это возможно, чтобы сделать ваш ответ более ясным. – Maddy

Смежные вопросы