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 をインスタンス化するときにスローされる例外は未チェックの例外 (extends RunTimeException) である必要があります。あなたの場合はUserNotLoggedInException、コンパイラがそれをチェックしたので;)。

UserNotLoggedInException拡張するように変更すると、RunTimeException機能するはずです

とにかく、例外を処理しない方がエレガントだといつも思います。次のようなことができます:

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

後で null 値を確認します。

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

}

これは、ユーザーが @Dependent スコープにある場合にのみ機能します。

私の意見では、ユーザーを Bean として宣言するのではなく、Bean 内のフィールドとして宣言することを避けるのが最善の方法です。したがって、この Bean は常に存在しますが、ログインしていないときはユーザー フィールドが null であり、ログインしているときは null ではありません。

Null Bean は少し奇妙です。

于 2013-07-31T13:48:11.297 に答える