2013-11-22 4 views
1

Я хотел бы знать, что является лучшим способом обработки ошибок проверки в средстве/большом приложении 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)
    • легко представить сообщения об ошибках
    • , но это решение кажется просто глупо
  • любые другие идеи?

Что было бы лучшим решением?

ответ

0

Выполнять проверку подлинности на бизнес-уровне и допускать исключение в случае сбоя. Вы можете просто обработать его в методе действия JSF.

E.g.

@EJB 
private SomeService service; 

public void someAction() { 
    try { 
     service.doSomething(); 
     addGlobalInfoFacesMessage("Doing something succeed!"); 
    } catch (SomeBusinessException e) { 
     addGlobalErrorFacesMessage("Doing something failed with {0}", e.getMessage()); 
    } 
} 

Или, вы можете позволить ей пойти и контейнер обрабатывать его с помощью <error-page> на конкретном <exception-type>.

Как выполнения аутентификации и проверки все само по себе, стек Java EE предлагает аннотаций как JAAS @RolesAllowed для аутентификации и JSR303 @NotNull, @Size и т.д. для модели. Это должно уменьшить контрольный шаблон if внутри самих методов обслуживания.

+0

Боюсь, этого недостаточно. (1) Как я уже говорил ранее: я хотел бы избежать использования исключений для управления потоком программы, (2) независимо от того, использую ли я JAAS (это слишком поздно для этого) или Java Bean Validation, будет много возможных, метод в EJB. И я хотел бы проинформировать пользователя обо всех них, а не об этом, который будет проверен во-первых. – zimi

+0

(3) Что касается страниц с ошибками, я хотел бы, чтобы пользователь оставался на странице, где находился, и предоставлял ему возможность исправлять ошибки/ошибки. – zimi

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