@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
クラス上の注釈@SessionScoped
(javax.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\""}}}}
@arjacsoh EL(Expression Language)からアクセスしたいCDI Bean、つまり自分のページに '@ Named'を追加する必要があると言わざるを得ないと思います。したがって、 '@ ManagedBean'を削除し、' @ Named'を 'Hello'に追加してください。例外については、スタックトレースを投稿してください。何が間違っているのか分かりません。 – rdcrng
それは私がやったことです。私は@ ManagedBeanを@ Namedに置き換え、さらにあなたが述べたようにimportステートメントjavax.enterprise.context.SessionScopedを置き換えました。私の更新で説明したように、データはJSFページにレンダリングされません。 – arjacsoh
また、更新プログラムで開始例外が発生していると言います。そのためにスタックトレースをポストできますか? – rdcrng