2011-09-23 6 views
24

数回の検索で、これはしばらくの間問題となっていたようです。私は次のようなFacesConverterを書いています。オブジェクトカテゴリはJPAエンティティであり、CategoryControlは、それをフェッチするDAOです。FacesConverterへのCDI注入

@FacesConverter(value = "categoryConverter") 
public class CategoryConverter implements Converter { 

@Inject private CategoryControl cc; 

public CategoryConverter() { } 

@Override 
public Object getAsObject(FacesContext context, UIComponent component, String value) { 
    if (cc != null) return cc.getByName(value); 
    System.out.println("CategoryConverter().getAsObject(): no injection!"); 
    return null; 
} 

@Override 
public String getAsString(FacesContext context, UIComponent component, Object value) { 
    if (!(value instanceof Category)) return null; 
    return ((Category) value).getName(); 
} 

} 

これまでに推測したように、私は決して注射を受けません。私はどちらか、この仕事をすることはできませんしかし、この:

Workaround for this problem: create this method in your localeController: 

public Converter getConverter() 
{ 
    return FacesContext.getCurrentInstance().getApplication().createConverter("localeConverter"); 
} 

and use converter="#{localeController.converter}" in your h:selectOneMenu. 

のように見えた、this pageからこの回避策を得ました。私のバッキングBeanはコンバーターを作成して返しますが、コンバーターにオブジェクトを注入することはありません。

私はMyFaces CODI 1.0.1を使用しています。現在のGlassFish/Weldコンテナを使用します。コンバータを使用しないようにコードを再作成する前に誰もが解決策を提案できますか?

答えて

53

@FacesConverter(value = "categoryConverter") 

によって

@Named 

を交換し

<h:inputSomething converter="#{categoryConverter}" /> 

又は

<f:converter binding="#{categoryConverter}" /> 

insteを使用ところで

<h:inputSomething converter="categoryConverter" /> 

または

<f:converter converterId="categoryConverter" /> 

の広告は、同様の問題が@FacesConverter内部@EJBのために存在します。ただし、JNDIを手動で取得する方法があります。 Communication in JSF 2.0 - Getting an EJB in @FacesConverter and @FacesValidatorも参照してください。この方法では、毎回手動で定義することなく@FacesConverter(forClass=Category.class)を使用することができます。残念ながら、私は頭の上からCDIの豆のためのそれを実現する方法を伝えることはできません。


更新:あなたはバージョン1.6であるため、JSFユーティリティライブラリOmniFacesを使用するために起こる場合は、追加の構成や注釈なし@FacesConverterクラスに@Inject@EJBを使用するための透明サポートを追加します。 the CDI @FacesConverter showcase exampleも参照してください。

+3

さて、私は冒されるでしょう。私は基本的にコンバータの中から式を評価するためにアプリケーションを呼び出す回避策を実装しましたが、これはもっとエレガントだと思います。だから別の質問がある@BalusC - あなたがJSFに関する本を書いた時ではない? – AlanObject

+3

ようこそ。本書に関して、あなたはこれを尋ねた最初の人物ではありません。 – BalusC

+0

あなたはあまり書く必要がありません - あなたがすでに書いたものをすべて編集してください。真剣に私はあなたにコラボレーションに興味があるならば、私に知らせて、本の概要を考えました。 – AlanObject

3

@FacesConverterに@Advanced of CODIを使用すると、Wikiが表示されます。

コンバータまたはバリデーターに@Advancedというアノテーションを付けるとすぐに@Injectを使用することができます。

2

パーBalusCの答えhere、私はJSF(requestscoped)を追加することを決めた私はJSFからの移行だから、唯一の私のアプリではこの問題を解決するために@FacesConverterとコンバータが含まれて豆を管理対象Beanを管理CDIに豆を管理していました。

@FacesConverterに対してCODI @アドバンスを試みましたが、Beanをまったく注入しませんでした。

6

@Inject注釈はCDI管理インスタンスでのみ機能します。非CDI管理インスタンス(JSF ValidatorやJSF Converterのような)内でCDI機能を使用する場合は、CDI APIに対して単にprogrammを使用できます。

これは少なくともJava EE 7 + CDI 1.1サーバーでのみ動作します。 AnnotationHellは、Java EEの人にコーディングする方法を忘れて、すべてでは

@FacesValidator("userNameValidator") 
public class UserNameValidator implements Validator { 

    private UserService userService; 

    public UserNameValidator(){ 
     this.userService = CDI.current().select(UserService.class).get(); 
    } 

    @Override 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
    .... 
    } 
} 

https://docs.oracle.com/javaee/7/api/javax/enterprise/inject/spi/CDI.html

関連する問題