Ich habe Probleme mit CDI im JSF-Projekt zu arbeiten. Ich kann CDI nicht zwingen, Interface-basierte Bean in JSF-Datei zu injizieren.CDI Interface-basierte Bean in JSF
@Named
public class ClassBasedNamedBean {
public String getMessage() {
return "Class-based Hello World!";
}
}
@Named
public interface InterfaceBasedNamedBean {
public String getMessage();
}
public class InterfaceBasedNamedBeanImpl implements InterfaceBasedNamedBean {
@Override
public String getMessage() {
return "Interface-based Hello World!";
}
}
ich beiden Bohnen in WebServlet Umgebung verwenden kann:
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
@Inject
private ClassBasedNamedBean classBasedNamedBean;
@Inject
private InterfaceBasedNamedBean interfaceBasedNamedBean;
protected void doGet(...) ... {
PrintWriter pw = response.getWriter();
pw.println("classBasedNamedBean: " + classBasedNamedBean.getMessage());
pw.println("interfaceBasedNamedBean: " + interfaceBasedNamedBean.getMessage());
// Output:
// classBasedNamedBean: Class-based Hello World!
// interfaceBasedNamedBean: Interface-based Hello World!
}
}
Aber interfaceBasedNamedBean
ist in JSF-Seite nicht zur Verfügung:
<p>ClassBasedNamedBean: #{classBasedNamedBean.message}</p>
<p>InterfaceBasedNamedBean: #{interfaceBasedNamedBean.message}</p>
Output:
<p>ClassBasedNamedBean: Class-based Hello World!</p>
<p>InterfaceBasedNamedBean: </p>
Wie könnte ich dieses Problem beheben? Benötigt JSF eine explizite Konfiguration für interfaceBasedNamedBean
?
'@ Named' ist erforderlich, um von einer JSF-Seite aus auf die Bean zuzugreifen ;-) –
Wie kann ich den richtigen BeanManager für JSF einstellen (ich bin ziemlich neu für JSF und CDI und überraschenderweise gibt Google nicht mehr klar Antwort in den ersten 3 Ergebnissen:])? Ich denke, ich muss es in 'web.xml' oder' faces-config.xml' einrichten. Dies scheint die wahrscheinlichste Lösung zu sein. (JSF impl: Mojarra, CDI Impl: Schweißnaht, AS: GlassFish) – Crozin
Wenn Sie auf einer Standard JEE 6-Umgebung (wie Glassfish) sind, machen Sie sich keine Sorgen über die BeanManager-Konfiguration, die alle eingestellt sein sollte. Versuchen Sie @named in die Implementierung zu verschieben, dies könnte eine Umgehung sein. Sollte das nicht besser funktionieren, machen Sie die Bean über einen Controller zugänglich, bis wir die eigentliche Ursache des Problems gefunden haben. –