gpt4 book ai didi

java ee cdi : catch exception thrown by producer method

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:48:36 24 4
gpt4 key购买 nike

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

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

我想在某处注入(inject)用户对象。我不能这样写方法:

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

正如编译器所说,UserNotLoggedInException 不会在任何方法中抛出。如果我捕捉到一个通用的 Exception,一切正常。这个问题有更优雅的解决方案吗?

谢谢

最佳答案

如 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 将始终存在,而它的用户字段在未登录时为 null,在登录时不为 null。

空 bean 有点奇怪。

关于java ee cdi : catch exception thrown by producer method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17966057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com