java ee cdi:抓取由producer方法抛出的异常

时间:2013-07-31 09:05:04

标签: java java-ee exception cdi

是否有可能捕获Java CDI中的生产者方法抛出的异常?我有以下生产者方法

@Produces
public User getLoggedInUser() throws UserNotLoggedInException {
    if(...){
        throw new UserNotLoggedInException();
    }
    User user = ... 
    ...
    return user;
}

我希望在某处注入用户对象。我不能写这样的方法:

private void doSomethingWithUser(){
    try {
        User loggedInUser = user.get(); // throws exception
    } catch (UserNotLoggedInException e){  // Compiler compains
        ...
    }
}

正如编译器所说,任何方法都没有抛出UserNotLoggedInException。如果我抓住通用Exception,一切正常。这个问题有更优雅的解决方案吗?

由于

1 个答案:

答案 0 :(得分:6)

正如CDI规范(http://docs.jboss.org/cdi/spec/1.0/html/contexts.html#contextual)中所述,实例化bean时抛出的异常应该是未经检查的异常(extends RunTimeException),我猜你的UserNotLoggedInException不是这样的,因为编译器检查它;)。

如果您更改了UserNotLoggedInException以使其扩展RunTimeException,则应该

无论如何,我总是发现避免处理异常会更优雅。你可以这样做:

@Produces
public User getLoggedInUser() throws UserNotLoggedInException {
    if(...){
        return null;
    }
    User user = ... 
    ...
    return user;
}

并稍后检查空值。

private void doSomethingWithUser(){
    if (user != null)
        User loggedInUser = user.get(); // throws exception

}

仅当您的用户位于@Dependent范围内时,才能执行此操作。

我认为最好的方法是避免将用户声明为bean,而是将其声明为bean中的字段。因此,这个bean将始终存在,而其用户字段在未登录时将为null,并且在登录时不为null。

空豆有点奇怪。

相关问题