Chcę wstrzyknąć ziarno CDI w ManagedBean za pomocą adnotacji @Inject lub @Produce. CDI Bean którego używam to:Jak wstrzyknąć ziarno CDI w ManagedBean?
@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, w którym chcę wstrzyknąć CDI Bean jest:
@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;
}
}
W funkcji init jednak rzuca NullPointerException. Jeśli używam adnotacji @Produces zamiast @Inject, wynik jest taki sam: NullPointerException. Czy coś jest nie tak z CDI Bean (niewłaściwe adnotacje)? Czy próbuję wstrzykiwać to w niewłaściwy sposób? Czy mój kod czegoś nie zawiera? Jak mogę to uruchomić? Oto kod 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: Jeśli używam Stateless Bean jako BaseBean i wstrzyknąć go z @EJB adnotacji, to działa bez problemu.
UPDATE: Próbowałem go z adnotacjami @SessionScoped
(javax.enterprise.context.SessionScoped
) i @Named
w klasie Hello
. Chociaż nie otrzymałem numeru NullPointerException
, h:selectManyCheckbox
jest pusty. co więcej, wydaje mi się, że kiedy dodam plik beans.xml
pod folderem META-INF
, otrzymuję StartException
, chociaż plik powinien tam być. Myślę, że moja aplikacja nie ma poprawnej konfiguracji, aby być w stanie Dependency Injection. Co prawdopodobnie będzie wymagać dodatkowej konfiguracji?
UPDATE 2: Ten błąd pojawia się, gdy dodaję plik beans.xml do folderu WEB-INF. Plik beans.xml jest pusta, to jest tylko jedna linia:
<?xml version="1.0" encoding="UTF-8"?>
błędu jest:
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 Przepraszam, myślę, że powinienem był wspomnieć, że powinieneś dodać '@ Named' do dowolnego komponentu CDI, który chcesz uzyskać z EL (język wyrażeń), tj. Twoja strona. Dlatego usuń '@ ManagedBean' i dodaj' @ Named' do 'Hello'. Jeśli chodzi o wyjątek, proszę wysłać ślad stosu, nie można wiedzieć, co jest nie tak. – rdcrng
To właśnie zrobiłem. Zamieniłem @ ManagedBean na @ Named i dodatkowo oświadczenie import javax.enterprise.context.SessionScoped zgodnie z podanym opisem. Dane nie są renderowane na stronę JSF, co wyjaśnię w mojej aktualizacji. – arjacsoh
Mówisz również w swojej aktualizacji, że otrzymujesz wyjątek od startu - czy możesz opublikować ślad stosu? – rdcrng