是否有可能捕获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
,一切正常。这个问题有更优雅的解决方案吗?
由于
答案 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。
空豆有点奇怪。