2013-03-11 17 views
6

@Injectまたは@Produceアノテーションを付けてManagedBeanにCDI Beanを挿入したいとします。私が使用CDIビーンは、次のとおりです。私はCDIビーンを注入したいManagedBeanにCDI Beanを挿入する方法は?

@Named 
@Startup 
@ApplicationScoped 
public class BaseBean { 

private List<String> custs; 

public List<String> getCusts() { 
    return custs; 
} 

public void setCusts(List<String> emps) { 
    this.custs = emps; 
} 

public BaseBean(){ 

} 

@PostConstruct 
void init() { 
    custs = new ArrayList<String>(); 
    custs.add("Cust1"); 
    custs.add("Cust3"); 
    custs.add("Cust2"); 
    custs.add("Cust4"); 
} 

} 

ManagedBeanは、次のとおりです。init関数で

@SessionScoped 
@ManagedBean 
public class Hello implements Serializable { 

@Inject 
private BaseBean dBean; 

private static final long serialVersionUID = 1L; 
private List<String> customers; 
private List<String> customersSelect; 

public Hello() { 
} 

@PostConstruct 
void init() { 
// dBean = new BaseBean(); 
    customers = dBean.getCusts(); 
} 

public List<String> getCustomers() { 
    return customers; 
} 

public List<String> getCustomersSelect() { 
    return customersSelect; 
} 

public void setCustomersSelect(List<String> customersSelect) { 
    this.customersSelect = customersSelect; 
} 
} 

しかし、それは、NullPointerExceptionがスローされます。 @Injectの代わりに注釈@Producesを使用すると、結果は同じです:NullPointerException。 CDI Bean(不適切なアノテーション)に問題はありますか?間違った方法で注入しようとしていますか?私のコードには何かがないのですか?どうすればそれを稼働させることができますか?ここではJSFのコードは次のとおりです。

<h:form id ="f"> 
    <h:selectManyCheckbox layout="pageDirection" border="1" value="#{hello.customersSelect}"> 
     <f:selectItems value="#{hello.customers}"></f:selectItems> 
    </h:selectManyCheckbox><br /> 
    <h:commandButton action="response.xhtml" value="Click me" /> 
</h:form> 

PS:私はBaseBeanとしてステートレスBeanを使用して、私は注釈@EJBでそれを注入した場合、それは問題なく動作します。

UPDATE:私はHelloクラス上の注釈@SessionScopedjavax.enterprise.context.SessionScoped)と@Namedでそれを試してみました。私はNullPointerExceptionを受け取っていませんが、h:selectManyCheckboxは空です。さらに、META-INFフォルダの下にbeans.xmlファイルを追加すると、ファイルがあるはずですが、StartExceptionが届きます。私のアプリケーションには依存性注入が可能な適切な構成がないと思う。追加設定が必要なのは何ですか?

UPDATE 2:このエラーは、beans.xmlファイルをWEB-INFフォルダに追加すると表示されます。

<?xml version="1.0" encoding="UTF-8"?> 

エラーは次のとおりです:

Services which failed to start:  service jboss.deployment.unit."JSF1.war".PARSE: org.jboss.msc.service.StartException in service jboss.deployment.unit."JSF1.war".PARSE: Failed to process phase PARSE of deployment "JSF1.war" 

12:51:11,482 ERROR [org.jboss.as.server.deployment.scanner] (DeploymentScanner-threads - 1) {"JBAS014653: Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"JBAS014671: Failed services" => {"jboss.deployment.unit.\"JSF1.war\".PARSE" => "org.jboss.msc.service.StartException in service jboss.deployment.unit.\"JSF1.war\".PARSE: Failed to process phase PARSE of deployment \"JSF1.war\""}}}} 

答えて

9

あなたのCDI Beanで@Namedを使用すると、@patlovが示唆していることは何を示唆していますか?ただし、CDIをサポートする環境で作業している場合は@ManagedBeanを使用しないでください。代わりに、CDIを使用してください。このanswerを参照してください。あなたがやろうとしていることに対して強くアドバイスする数多くのものを見つけることができます。

javax.faces.bean.SessionScopedからjavax.enterprise.context.SessionScopedに切り替えるとすべてが魔法のように機能します。あなたが遭遇するのは、CDIの@ViewScopedの不在です。その場合、JBoss SeamやApache Deltaspikeのようなものを使って実装します。また、既存のコードがすでにJSF用に作成されている場合は、自動的にすべてのJSFスコープをCDIスコープに自動的に置き換えます。

更新: これはあなたの豆の内容にする必要があります。xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> 
</beans> 
+0

@arjacsoh EL(Expression Language)からアクセスしたいCDI Bean、つまり自分のページに '@ Named'を追加する必要があると言わざるを得ないと思います。したがって、 '@ ManagedBean'を削除し、' @ Named'を 'Hello'に追加してください。例外については、スタックトレースを投稿してください。何が間違っているのか分かりません。 – rdcrng

+0

それは私がやったことです。私は@ ManagedBeanを@ Namedに置き換え、さらにあなたが述べたようにimportステートメントjavax.enterprise.context.SessionScopedを置き換えました。私の更新で説明したように、データはJSFページにレンダリングされません。 – arjacsoh

+0

また、更新プログラムで開始例外が発生していると言います。そのためにスタックトレースをポストできますか? – rdcrng

1

プロパティを注入する@ManagedBean使用@ManagedProperty使用している場合:

@ManagedProperty(value = "#{baseBean}") 
private BaseBean dBean; 

// getter and setter 
3

をbeans.xmlファイルが空で、それだけの行が含まれていますアプリケーションにWEB-INF/beans.xmlファイルを入れてCDIを有効にしてください。

+0

WEB-INFの下に追加すると、サーバーorg.jboss.msc.service.StartExceptionの開始時にエラーが発生します。 META-INFの下に追加すると、サーバーが起動しますが、問題は取り除かれません。それでもなおNullPointerException。 – arjacsoh

+1

'StartException'は正しい方向です。 CDIが有効になる前にCDIに関連するいくつかの問題があることを前提としています。 –

+0

私は何とかそれを逃した。 stacktraceはそれについて何も示唆していません。 –

関連する問題