Править: Я изучил Spring 3 @ExceptionHandler
аннотация и комбинирующий это с Опцией 1 ниже надеется быть довольно чистым решением.
Я также нашел, что это было хорошим чтением: http://blog.decaresystems.ie/index.php/2006/04/07/difficult-choices-in-handling-exceptions-in-enterprise-java-applications/
Я разрабатывал использование Spring платформа MVC в течение некоторого времени теперь однако, я изо всех сил пытаюсь придумать 'хороший' способ передать ошибки, которые повышены на уровне служб назад к JSP.
В основном я не полагаю, что бизнес-логика (вне "этого поля обязательно") должна быть в Блоках проверки допустимости, особенно любая логика, которая требует доступа к DB. Так, что я делал, помещает далее, более сложная проверка и бизнес-логика на уровне служб.
Например, позволяет, говорят, что у меня есть страница, которая позволяет пользователю покупать Книгу. Они нажимают "Purchase" на JSP, и контроллер называет сервис, чтобы заставить все это произойти... Теперь, что происходит, если сервис видит, что у них есть недостаточные фонды - как я возвращаю это сообщение к JSP так, миленькие "Недостаточные фонды" сообщение могут быть отображены пользователю? Я рассмотрел два пути, и я не уверен, который корректен...
Опция 1: исключения
Первым путем я думал, должен был повысить исключение на уровне служб, захватить его в контроллере и добавить сообщение к BindingResult.
Сервис:
public void pay(Book book) throws InsufficientFundsException {
// Some logic goes here, which ends up throwing the above exception
}
Контроллер:
public ModelAndView(@ModelAttribute("book") Book book, BindingResult errors) {
try {
pay(book);
} catch (InsufficientFundsException ex) {
errors.reject("insufficient.funds");
}
return new ModelAndView(blahblahblah);
}
Опция 2: Передайте BindingResult Уровню служб
Второй путь состоял в том, чтобы передать объект BindingResult уровню служб и повысить дальнейшие ошибки против него.
Сервис:
public void pay(Book book, BindingResult errors) {
// User has insufficient funds, so...
errors.reject("insufficient.funds);
}
Я вижу проблемы с обоими из этих путей. Опция 1 чувствует себя неловкой, потому что не только делают я должен поймать исключение, я затем должен добавить ошибку к обязательному результату, таким образом, такое чувство, что я делаю то же самое дважды. И Опция 2, кажется, связывает уровень служб слишком плотно с контроллером.
Наконец, я понимаю, что существует SimpleMappingExceptionResolver
это могло использоваться в сочетании с Опцией 1, но я не уверен, насколько соответствующий это (возможно, я не видел надлежащего примера?). В вышеупомянутом примере, позволяет, просто говорят для пользы аргумента, что я хотел бы пользователя, возвращенного к исходной форме с красной ошибкой выше формы, не перенаправленной к совершенно другой странице. SimpleMappingExceptionResolver, кажется, мне полезен, когда Вы хотите перенаправить пользователя к странице стандартной погрешности, когда определенное исключение повышено (который является не совсем, что я хочу знать, как сделать).
Java использует исключения для естественной обработки таких вещей. В конце концов, это обычно упрощает вашу логику и снижает вероятность ошибки, если вы забудете проверить, что что-то было ошибкой. Вы также можете убрать логику ошибок из основного потока кода.
Я не понимаю, почему представленный вами случай отличается от любого другого случая, когда я бы использовал обработку исключений для работы с ошибками.