Я хотел бы знать, что является лучшим способом обработки ошибок проверки в средстве/большом приложении Java EE.Обработка ошибок проверки из EJB в JSF
Предположим, что у меня есть фасоль и фасад, как он внизу.
class SomeManagedBean {
@EJB
SomeFacade someFacade;
public void performSomeAction() {
(...)
someFacade.businessAction(loggedUser, editedEntity);
(...)
}
}
class SomeFacadeImpl {
public Object businessAction(User user, Entity entity) {
if (!isInCorrectStateToDoAction(entity)) {
// error A
}
(...)
if (!hasRightToDoAction(user, entity)) {
// error X
}
doAction(user, entity);
}
}
Я ожидаю, что businessAction от SomeFacade должны проверить свои входы и проверить, если он может сделать это бизнес-действия с заданными аргументами. Это потому, что я могу использовать этот бизнес-метод в нескольких местах приложения, и я не хочу использовать код проверки подлинности.
Предположим, что я хотел бы использовать FacesMessage для предоставления информации о клиентах об ошибках проверки.
Некоторые решения:
- исключения - когда что-то не так с аргументами я просто выбросить исключение
- поэтому я должен бросить IncorrectStateForActionException, NoRightToDoActionException
- почему: не могу бросить только одно исключение поэтому я не могу уведомить пользователя о нескольких вещах: «У вас нет прав», (...), «Entity is wrong state»
- кроме исключения не должны использоваться для обеспечения логики нашего приложения
некоторый Результат класс
class Result<T> { T returnedValueFromMethod; List<ProcessingError> errors; }
Теперь определение моего метода бизнеса выглядит следующим образом:
public Result<Object> businessAction(User user, Entity entity)
когда что-то не так я добавляю информацию об ошибке Результата
- , когда все в порядке, я положил возвращаемое значение для объекта Result и вернуть этот объект
- почему бы и нет: это похоже на «код ошибки» в довольно сложной структуре. Из-за этой рекомендации, которая говорит «изменить коды ошибок в исключение», понятно, почему мы хотели бы избежать этого.
- мы можем сделать проверку на фасаде и контроллер
- почему: не дублируется код
- проверку только в контроллере и действии в фасаде
- почему нет: это может быть опасно, когда мы используйте этот businessAction метод от другого места в коде
- мы можем сделать два метода в фасад: проверки и действия (запрос команды Разделение)
- результатом проверки должен содержать все возможные ошибки, которые могут возникнуть, так что это довольно странно, структура
- мы можем сделать несколько методов для проверки (ошибки от А до X)
- легко представить сообщения об ошибках
- , но это решение кажется просто глупо
- любые другие идеи?
Что было бы лучшим решением?
Боюсь, этого недостаточно. (1) Как я уже говорил ранее: я хотел бы избежать использования исключений для управления потоком программы, (2) независимо от того, использую ли я JAAS (это слишком поздно для этого) или Java Bean Validation, будет много возможных, метод в EJB. И я хотел бы проинформировать пользователя обо всех них, а не об этом, который будет проверен во-первых. – zimi
(3) Что касается страниц с ошибками, я хотел бы, чтобы пользователь оставался на странице, где находился, и предоставлял ему возможность исправлять ошибки/ошибки. – zimi