在哪里以及如何处理Spring+Hibernate的异常?

15

我正在使用Spring+Hibernate开发桌面应用程序。

我试图采用分层实现构建它,因此我有:

GUI层--调用-->服务层--调用-->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层处理异常,这样我可以向用户显示消息,这样好吗? 有一种方法可以使用Spring构建一些ExceptionHandler吗?
使用spring+hibernate管理异常的最佳实践是什么?
谢谢。
2个回答

4
我建议您将抛出的异常封装在自己的异常类中,并让它们冒泡到GUI层。

3
如果您正在使用Spring MVC,那么有一种编写ExceptionHandlerResolver的解决方案,请查看文档documentation
如果您没有使用Spring MVC,我建议从DAO抛出异常到Service,然后再到View层。只有View层可以根据捕获的异常为用户提供有价值的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接