0

@ApplicationException アノテーション付きクラスで呼び出されない @Inject および @PostConstruct メソッドに問題があります。サービス (=ejb) レイヤーで JPA、CDI、および EJB を使用して Glassfish 3.0.1 を使用しており、セッション言語のテキストを含む errorMessage をスローしたいと考えています。

抽象 ExceptionClass があります

 public abstract class LocalizedException extends Exception {
        private static final long serialVersionUID = 1L;


 String localizedMessage;

 //This method should be called as @PostConstruct from the concrete classe
protected void setLocalizedMessage(LocaleHandler localeHandler, String key){
    this.setLocalizedMessage(localeHandler, key, new Object());
}

protected void setLocalizedMessage(LocaleHandler localeHandler, String key, Object... args){
    localizedMessage = ErrorMessages.getErrorMessage(key,localeHandler.getAktuelleLokale(),args);
}

 @Override
 public String getMessage() {
  return localizedMessage;
 }

 @Override
 public String getLocalizedMessage() {
  return localizedMessage;
 }}

そして具体的なクラス:

 @ApplicationException
        public class ConcreteException extends LocalizedException {
        private static final long serialVersionUID = 2615388267911318734L;
 private int userId;

 public ConcreteException(int userId) {
     this.userId=userId;
 }

 public int getUserId() {
  return userId;
 }

 @PostConstruct
 @Inject  
 public void initText(LocaleHandler localeHandler){
         setLocalizedMessage(localeHandler, "msgKey");
 }

}

LocaleHandler (=Sessionscoped) を注入して、バンドルからエラー メッセージを取得するために使用される currentLocale を提供する必要があります。問題は、何を試しても @PostConstruct が呼び出されないことです。@Named で具象クラスに注釈を付け、抽象クラスの代わりに具象クラスで @Inject を使用しましたが、何も機能しません。initText() を直接呼び出すと、(デバッガーで) LocaleHandler が挿入されていないことがわかります。

今、私は Exception クラスと CDI に関する制限があるのか​​、それとも単に問題の原因が見つからなかったのかを自問しています!

あなたは答えを知っていますか ?

事前に感謝

トーマス

4

1 に答える 1

0

問題は解決された。

昔から慣れ親しんでいるように、単純に Exception を としてthrow new ConcreteException()使用しました。まさにこれが問題でした。次に、EJB に ConcreteException を挿入し、containercreated フィールドをスローします。このように @Inject と @Postconstruct が機能しています!

于 2010-12-24T14:31:57.067 に答える