Wie installiere und benutze CDI auf Tomcat?
Ich bin momentan dabei, mein erstes Projekt, Java EE 7, aber ich habe Schwierigkeiten. Jede Hilfe zu schätzen wissen.
- Tomcat 7.0.34
- JSF 2.2
- Primefaces 3.5
- javaee-api-7.0.jar
Wenn Sie die Anwendung starten, die Tomcat-log erscheint die folgende Meldung:
"validateJarFile (C:\...\build\web\WEB-INF\lib\javaee-api-7.0.jar)-jar not loaded. See Servlet 2.3 Spec, section 9.7.2. Offending class: javax/servlet/Servlet .class"
wenn ich auf den button, der ruft die managed bean, bekomme ich die Fehlermeldung:
Advertência: /index.xhtml @18,66 value="#{indexMB.user}": Target Unreachable, identifier 'indexMB' resolved to null
javax.el.PropertyNotFoundException: /index.xhtml @18,66 value="#{indexMB.user}": Target Unreachable, identifier 'indexMB' resolved to null
IndexMB
@Named("indexMB")
@RequestScoped
public class IndexMB {
private String password;
private String user;
public String loginTest(){
return (this.user.equals("admin") ? "adminPage" : "inOutPage");
}
//getters and setters
}
index.xhtml
<html ...>
<f:loadBundle basename="i18n" var="bundle" />
<h:head>
<title>#{bundle['index_title']}</title>
</h:head>
<h:body>
#{bundle['index_appname']}
<br />
<h:form id="frmIndex">
<p:panelGrid columns="2">
<p:outputLabel for="user" value="#{bundle['lblUser']}" />
<p:inputText id="user" value="#{indexMB.user}" />
<p:outputLabel for="password" value="#{bundle['lblPassword']}" />
<p:password id="password" value="#{indexMB.password}" />
</p:panelGrid>
<p:commandButton action="#{indexMB.loginTest}" value="#{bundle['btn_login']}" />
</h:form>
</h:body>
faces-config.xml
<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
<application>
<locale-config>
<default-locale>pt_BR</default-locale>
<supported-locale>en</supported-locale>
<supported-locale>fr</supported-locale>
</locale-config>
</application>
Diese Themen haben nicht geholfen mich:
- Java EE 6 @javax.Anmerkung.ManagedBean vs. @javax.injizieren.Benannt vs. @javax.Gesichter.ManagedBean
- Ziel nicht erreichbar Bezeichner aufgelöst zu null
- Target Unreachable, identifier aufgelöst zu null
- javax.el.PropertyNotFoundException : Target Unreachable, identifier 'login' gelöst zu null Frühling + JSF
- http://www.andrejkoelewijn.com/blog/2010/03/05/jee-cdi-tip-target-unreachable-identifier-resolved-to-null/
InformationsquelleAutor der Frage Rogério Arantes | 2013-09-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tomcat als Barebone-JSP/Servlet-container nicht unterstützt CDI aus der box. Wie genau hast du installiert CDI? Hast du wirklich drop
javaee-api-7.0.jar
im/WEB-INF/lib
nur, um deinen code zu kompilieren? Oh bitte Nein, das ist nicht der richtige Weg. Die Java EE API-JAR enthält ausschließlich die API-Klassen, nicht die konkrete Implementierung. Loszuwerden, die ganze JAR. Es kann dazu führen, viele andere Portabilität Probleme wie die beschriebenen, in diese Antwort: Wie kann ich importieren Sie die javax.servlet-API in mein Eclipse-Projekt? sollten Sie tatsächlich installieren die konkrete Umsetzung zusammen mit den spezifischen API.Haben Sie 2 Möglichkeiten:
Drop Tomcat und gehen Sie für eine echte Java-EE-container. Als Sie Tomcat verwenden, nur einen Schritt über TomEE. Es ist wirklich einfach, laden Sie die TomEE web-Profil zip-Dateientpacken Sie es und integrieren es in Eclipse genau der gleichen Weise, wie Sie das für Tomcat. Vergessen Sie nicht, entfernen Sie die Java EE-JAR-Datei von webapp und verändern die Gezielte Laufzeit Eigenschaft in den Projekteigenschaften von Tomcat, TomEE, so dass die Java-EE-Abhängigkeiten korrekt aufgelöst.
Ohne zusätzliche Gläser oder Konfiguration ist notwendig. Sie können sogar entfernen Sie die JSF-JARs aus Ihre webapp. TomEE wie eine echte Java-EE-container stellt bereits unter anderem JSF und CDI aus der box. Falls Sie mit Maven, die unterhalb der Koordinate ist ausreichend.
Hinweis auf die Bedeutung der
provided
und seiner Bedeutung als in der "target-runtime bietet bereits diese aus der box". Siehe auch unsere JSF-wiki-Seite.Installieren Sie eine wahre CDI-Implementierung auf Tomcat. Schweißen ist eines der verfügbaren CDI-Implementierungen. In die Schweißnaht installation guide finden Sie eine Anleitung, wie man Integration in Tomcat. Der Vollständigkeit halber und als zukünftige Referenz, hier sind die Schritte:
Drop die
weld-servlet-shaded.jar
in webapp ist/WEB-INF/lib
. Falls Sie mit Maven, verwenden Sie diese koordinieren:Erstellen
/META-INF/context.xml
- Datei im webapp mit folgenden Inhalt:Beachten Sie, dass dieser Schritt ist nicht unbedingt notwendig, wenn Sie mit Mojarra 2.2.11 oder neuer, wie es in der Lage sein, um es zu finden über
ServletContext
wenn nicht vorhanden in der JNDI.Erstellen Sie eine leere
/WEB-INF/beans.xml
- Datei im webapp.Dass es (Hinweis: in älteren Weld-Servlet-Versionen, man muss explizit registriert mit der CDI-bean-manager Schweißen und Zuhörer in
web.xml
auch, aber das ist unnötig mit den aktuellen Versionen).Falls Sie lieber OpenWebBeans oben Weld als CDI-Implementierung, den Kopf auf diesem blog für die detaillierte Maven installation Anleitung: Wie zu installieren CDI in Tomcat?
Unabhängigen zu dem konkreten problem, der JSP/Servlet-APIs von Tomcat 7 nicht erfüllen diese APIs von Java EE 7, statt es entspricht der Java EE 6 (Servlet 3.0 /JSP 2.2). Wenn Sie möchten, dass die Tomcat-äquivalent von Java EE 7 (Servlet 3.1 /JSP 2.3), dann sollten Sie einen Blick auf Tomcat 8. Siehe auch Apache Tomcat-version matrix.
InformationsquelleAutor der Antwort BalusC
Andere mögliche option ist verlassen
beans.xml
in Ihrer Bereitstellung.InformationsquelleAutor der Antwort lucasvc