Пасование назад ошибок к представлению от уровня служб

Править: Я изучил Spring 3 @ExceptionHandler аннотация и комбинирующий это с Опцией 1 ниже надеется быть довольно чистым решением.

См. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers

Я также нашел, что это было хорошим чтением: 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, кажется, мне полезен, когда Вы хотите перенаправить пользователя к странице стандартной погрешности, когда определенное исключение повышено (который является не совсем, что я хочу знать, как сделать).

8
задан Ben J 12 July 2010 в 00:18
поделиться

1 ответ

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

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

4
ответ дан 6 December 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: