6

アノテーション@Injectまたは@Produceを使用してManagedBeanにCDIBeanを注入したいと思います。私が使用するCDIBeanは次のとおりです。

@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");
}

}

CDIBeanを注入するManagedBeanは次のとおりです。

@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;
}
}

ただし、init関数では、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:ステートレスBeanをBaseBeanとして使用し、アノテーション@EJBを付けて挿入すると、問題なく機能します。

更新:アノテーション@SessionScopedjavax.enterprise.context.SessionScoped)とクラスで試してみ@Namedました。Helloを受け取りませんがNullPointerExceptionh:selectManyCheckboxは空です。beans.xmlさらに、フォルダの下にファイルを追加すると、ファイルがあるはずMETA-INFなのに、を受け取ることに気づきます。StartException私のアプリケーションには、依存性注入を実行できる適切な構成が欠けていると思います。追加の構成が必要になる可能性が高いものは何ですか?

更新2:このエラーは、beans.xmlファイルをWEB-INFフォルダーに追加すると表示されます。Beans.xmlファイルは空で、次の行のみが含まれています。

<?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\""}}}}
4

3 に答える 3

9

@patlovが提案していることは、CDIBeanで使用する場合に機能@Namedします。ただし、CDIをサポートする環境で作業している場合は、を使用しない@ManagedBeanでください。代わりに、CDIをずっと使用してください。この答えを見てください。あなたがやろうとしていることに強く反対する他の多くの答えを見つけることができると確信しています。

javax.faces.bean.SessionScopedからに切り替えるだけでjavax.enterprise.context.SessionScoped、すべてが魔法のように機能します。ただし、CDIがない場合に遭遇する可能性があります。その場合は、JBossSeamやApacheDeltaspikeなどを@ViewScoped使用して実装してください。追加の利点として、JSF用に既存のコードが既に記述されている場合は、すべてのJSFスコープが自動的にCDIスコープに置き換えられます。

更新: これは、beans.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>
于 2013-03-11T17:20:15.657 に答える
3

WEB-INF/beans.xmlアプリケーションにファイルを配置して、CDIが有効になっていることを確認してください。

于 2013-03-11T15:17:13.613 に答える
1

@ManagedBeanuseを使用@ManagedPropertyしてプロパティを挿入する場合:

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

// getter and setter
于 2013-03-11T15:12:55.217 に答える