Где и как обрабатывать исключения spring + hibernate?

im, используя spring + hibernate для настольного приложения.

Я пытаюсь создать его с помощью многоуровневой реализации, поэтому у меня есть:

Уровень GUI --call → Сервисный уровень --call → Уровень DAO

Небольшой пример, чтобы лучше преуспеть в моей ситуации:

// In GUI layer
private void actionPerformed(ActionEvent evt){
    addUser();
}

private void addUser(){
    // Check gui validation for user inputs
    if(inputIsValid()){
        String username=nameText.getText();
        String pass=passText.getText();
        //Now call service layer
        userService.createUser(username, pass);
        // Now here i want to show a message to user like
        // "Operation successful" or "Operation failed"
        // or more sofisticated message like "User with same name already exists"
    }
}


// Service layer
@Transactional
public void createUser(String name, String pass){
    User user=new User(name, pass);
    userDao.save(user);
}

// Another service layer example, 
@Transactional
public boolean createUser(String name, String pass){
    User user=new User(name, pass);
    try{
        userDao.save(user);
    }
    catch(Exception ex){
        Log(ex);
        return false;
    }
    return true;
    // In this case GUI layer can know if save is succesful, but it can't know WHY
    // the save is failed : some username? DB service shutdown? etc..
}

Проблема заключается в том, кто бросает исключение и кто его обрабатывает?

Я думаю, что DAO должно выбросить первое исключение, а уровень сервиса - сбросить его, и, наконец, GUI-слой обрабатывает исключение, поэтому я могу показать сообщение пользователю, это хорошо? Существует способ создания некоторого ExceptionHandler с помощью spring?

Какова наилучшая практика для управления исключениями с помощью spring + hibernate?

Спасибо.

Ответы

Ответ 1

Если вы используете Spring MVC, тогда есть решение для записи ExcpetionHandlerResolver, посмотрите на документацию < ш >

Если вы не работаете с Spring MVC. я предложил бы выбросить исключение из DAO в Service, а затем в View layer. Только уровень представления может действительно предоставлять ценную информацию пользователю на основе исключения.

Ответ 2

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