3

是否可以捕获 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,一切正常。这个问题有更优雅的解决方案吗?

谢谢

4

1 回答 1

6

正如 CDI 规范(http://docs.jboss.org/cdi/spec/1.0/html/contexts.html#contextual)中所述,实例化 bean 时抛出的异常应该是未经检查的异常(扩展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总是存在的,而它的用户字段在未登录时为空,登录时不为空。

空豆有点奇怪。

于 2013-07-31T13:48:11.297 回答