2012-03-28 9 views
2

faces-configのマネージドBean宣言をCDI(Weld)に置き換えています。CDIで管理されていないクラスを注入しますか?

問題は基本的にはこれです:

プロジェクトは、「ウェブ」と「コア」に構成されています。 Webには、マネージドBeanとして宣言されているBeanがあります。彼らはまた、豆ではなくpojos(?)であると宣言されたプロパティを持っています。コアクラスは、統合クラス、ドメインクラスなどです。

@Namedでコアクラスの名前を付けることはできません。なぜなら、明らかにアプリケーションのWeb部分の成果物に慣れていないからです。

今日では、彼らは私がこれまでに読んしようとしていますが、いくつかの助けをいただければ幸いです。この

<managed-property> 
     <property-name>UserData</property-name> 
     <value>#{sessionScope.UserData}</value> 
    </managed-property> 

ように指定されています。私はCDI使用して管理対象Beanではありません管理プロパティを注入するにはどうすればよい

(あるいはJSF2を?)

管理対象Beanに管理対象Beanを注入するには、完璧に動作し、CDIは、本当に私はそう、私はこの問題を解決することを望むためとして蹴っていますすぐに。

乾杯

+0

をJSF2注釈で、それは '@ManagedProperty("#{sessionScope.userDataで可能な} ")'を '@ManagedBean'クラスの希望の' userData'プロパティに追加します。 CDIでそれをどうやって行うのか分かりません。ところで、あなたのインスタンス変数の名前の大文字化は間違っています。小文字で始まる必要があります。 – BalusC

+0

注入を試みたときのエラーメッセージが忘れてしまった: org.jboss.weld.exceptions.DeploymentException:WELD-001408注入点[[field] @Inject private comで修飾子[@Default]を持つ[FPUserData]タイプの依存関係が満たされていない.wmdata.raindance.portal.ui.RPBaseController.fpUserData] –

+0

今、私は熟達者自身が知らないと怖いです。あなたはインスタンス変数名については正しいですが、私は他の人に読みやすさを高めるために何も意味しない名前の部分を切り捨てました –

答えて

2

どのようにCDI 使用して管理対象Beanではありません管理プロパティ注入しない(あるいはJSF2を?)

私が正しくあなたの問題を得た場合は、CDI-Extensionがあります行くあなたの方法。起動時にNon-CDI-Beansを解析し、AnnotatedTypeとしてそれらをラップし、それによりそれらを注入可能にする拡張機能を登録することができます。

Weld documentationの第16章をご覧ください。特に16.6はあなたの使用状況によく似ています。

And:「独自の拡張機能を作成する」がフレームワークをハッキングするように聞こえるのではないかと心配します。 CDIは拡張コンセプトを念頭に置いて設計されており、独自のコードを拡張子として登録することは非常に簡単で困難な作業です。

+1

何度か読んだ後、私はこの答えが有効であると確信しています。私は別の解決策が必要でしたが、それは私の質問に正しく言葉を指定しなかったからです。 –

1

コメントでリクエストされているように、標準のJSFアノテーションを使用する場合は、次のようにします。

を考えると、このJSF 1.xの管理Beanの登録:

<managed-bean> 
    <managed-bean-name>bean</managed-bean-name> 
    <managed-bean-class>com.example.Bean</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
    <managed-property> 
     <property-name>userData</property-name> 
     <value>#{sessionScope.userData}</value> 
    </managed-property> 
</managed-bean> 
ここ

JSF 2.xのアノテーションは、このJSF 1.xのスタイルXML登録を取り除くように設定することができる方法です:

package com.example; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 
import javax.faces.bean.RequestScoped; 

@ManagedBean 
@RequestScoped 
public class Bean { 

    @ManagedProperty("#{sessionScope.userData}") 
    private UserData userData; 

    // ... 
} 
+0

ありがとうございました。私は当初、このelベースのソリューションを使用しなければならないと感じていたし、スペック間にごめんなさい。 喜んで私はする必要はありません。しかし、やはりあなたはjsfユーザーのための素晴らしい貢献者です –

2

私たちのアプリケーションは、これらのオブジェクトをセッションまたはアプリケーション開始時に挿入します。私が必要としていたのは、外部の状況からそれらを得て、それを返すプロデューサーでした。私のソリューションは、次のとおりです。

Superproducer:

import java.util.Map; 
import javax.faces.context.FacesContext; 
import javax.inject.Inject; 

/** 
* @author Karl Kildén 
* 
* Superclass that should be extended for other producers that uses ext context. 
*/ 
public class BaseExtContextProducer { 

    @Inject 
    protected FacesContext facesContext; 

    // map used to get UserData objects 
    protected Map<String, Object> parameterMap = (Map<String, Object>) facesContext 
     .getExternalContext().getSessionMap(); 

    // variable name i.e "your variable" + message is used for Exception messages 
    protected final String message = " may not be null"; 
} 

私のオブジェクトを返す実際のプロデューサーレイアウト:

import javax.enterprise.context.ApplicationScoped; 
    import javax.enterprise.inject.Produces; 
    import org.jboss.weld.exceptions.NullInstanceException; 

    import com.wmdata.raindance.portal.annotation.qualifiers.FromExtContext; 
    import com.wmdata.raindance.portal.tool.UserMessage; 

    /** 
    * 
    * @author Karl Kildén 
    * 
    * This producer gets YourObject that is stored in the external context. 
    */ 


     public class YourObjectProducer extends BaseExtContextProducer { 

      @Produces 
    //Qualifiers, scopes etc 
      @ApplicationScoped @FromExtContext 
      public YourObject getYourObject() { 
      YourObject yourObject = (YourObject) parameterMap 
       .get(YourObject.getStaticName); 

      if (YourObject == null) { 



// Suggestion: use enum or static name to avoid getting with "" for cleaner code 
    throw new NullInstanceException(null, 
       YourObject.getStaticName + message); 
     } 

     return userMessage; 
     } 
    } 
関連する問題