JSF EJB wird nicht injected

y0dA

Top Contributor
Hallo!
Technologien: JSF 2.0, EJB 3.1, JBossAS 6.0

Projektstruktur:
Ear (Ear Projekt)
Service (beinhaltet die EJBs --> @Stateless)
ServiceClient(beinhaltet die Interfaces von Service --> @Local)
Web (JSF 2.0 Mojarra)

Projekte habe ich mit dem Eclipse Wizard angelegt.
Nun habe ich auf den JBoss deployed (sprich das EAR in Eclipse dem JBoss geadded), der Server startet ohne Fehler, die Applikation ist ansprechbar nur wird folgendes nicht injected (ist eine Bean zu einer .xhtml):
Java:
public class TestBean {

	@EJB
	private TestServiceLocal testService;
	
	private String testText;

	public TestBean() {
		System.out.println("wir waren im konstruktor");
		testText = testService.doTest();
	}
	
	@PostConstruct
	public void init() {
		testText = testService.doTest();
	}
	
	public void setTestText(String testText) {
		this.testText = testText;
	}

	public String getTestText() {
		return testText;
	}
}

Java:
@Stateless
public class TestService implements TestServiceLocal {

	@Override
	public String doTest() {
		// TODO Auto-generated method stub
		return "Teststring";
	}

	
}

Java:
@Local
public interface TestServiceLocal {

	public abstract String doTest();
}

faces-config.xml
[xml]
<?xml version="1.0"?>
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xi="http://www.w3.org/2001/XInclude"
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/web-facesconfig_2_0.xsd">
<managed-bean>
<managed-bean-name>testBean</managed-bean-name>
<managed-bean-class>de.xx.web.test.TestBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>

</faces-config>
[/xml]

web.xml
[xml]
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Web</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<description>JavaServer Faces 2.0 - Hello World</description>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<listener>
<listener-class>com.sun.faces.application.WebappLifecycleListener</listener-class>
</listener>

<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>hello.xhtml</welcome-file>
</welcome-file-list>
</web-app>
[/xml]

Muss ich eventuell dem JBoss irgendein JAR ins lib legen?
Mein EAR Projekt (durch Eclipse erstellt) besitzt lediglich einen Ordner "EarContent" selbiger ist aber leer und sonst gibts in dem Projekt auch nix anderes.

Benutze:
[xml]
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
</dependency>
[/xml]

--> kannte ich bisher nicht, habe immer mit
[xml]
<dependency>
<groupId>javax.ejb</groupId>
<artifactId>ejb-api</artifactId>
<version>3.0</version>
<scope>provided</scope>
</dependency>
[/xml]
gearbeitet nur gibt es hierzu kein 3.1
 
Zuletzt bearbeitet:
Logauszug beim Serverstart:
Code:
16:41:15,656 INFO  [org.jboss.ejb3.instantiator.deployer.BeanInstantiatorDeployerBase] Installed org.jboss.ejb3.instantiator.impl.Ejb31SpecBeanInstantiator@9cb796 into MC at org.jboss.ejb.bean.instantiator/STAEar/STAService/TestService
16:41:15,671 WARN  [org.jboss.ejb3.interceptor.InterceptorInfoRepository] EJBTHREE-1852: InterceptorInfoRepository is deprecated
16:41:16,625 INFO  [org.jboss.ejb3.deployers.JBossASKernel] Created KernelDeployment for: Service.jar
16:41:16,625 INFO  [org.jboss.ejb3.deployers.JBossASKernel] installing bean: jboss.j2ee:ear=Ear.ear,jar=Service.jar,name=TestService,service=EJB3
16:41:16,625 INFO  [org.jboss.ejb3.deployers.JBossASKernel]   with dependencies:
16:41:16,625 INFO  [org.jboss.ejb3.deployers.JBossASKernel]   and demands:
16:41:16,625 INFO  [org.jboss.ejb3.deployers.JBossASKernel] 	jboss.ejb:service=EJBTimerService; Required: Described
16:41:16,625 INFO  [org.jboss.ejb3.deployers.JBossASKernel] 	jboss-switchboard:appName=Ear,module=Service,name=TestService; Required: Create
16:41:16,656 INFO  [org.jboss.ejb3.deployers.JBossASKernel]   and supplies:
16:41:16,656 INFO  [org.jboss.ejb3.deployers.JBossASKernel] 	jndi:Ear/TestService/local-de.xx.service.TestServiceLocal
16:41:16,656 INFO  [org.jboss.ejb3.deployers.JBossASKernel] 	jndi:Ear/TestService/local
16:41:16,656 INFO  [org.jboss.ejb3.deployers.JBossASKernel] 	jndi:TestService
16:41:16,656 INFO  [org.jboss.ejb3.deployers.JBossASKernel] 	Class:de.xx.service.TestServiceLocal
16:41:16,656 INFO  [org.jboss.ejb3.deployers.JBossASKernel] Added bean(jboss.j2ee:ear=Ear.ear,jar=Service.jar,name=TestService,service=EJB3) to KernelDeployment of: Service.jar
16:41:17,640 INFO  [org.jboss.ejb3.session.SessionSpecContainer] Starting jboss.j2ee:ear=Ear.ear,jar=Service.jar,name=TestService,service=EJB3
16:41:17,687 INFO  [org.jboss.ejb3.EJBContainer] STARTED EJB: de.xx.service.impl.TestService ejbName: TestService
16:41:17,843 INFO  [org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:

	Ear/TestService/local - EJB3.x Default Local Business Interface
	Ear/TestService/local-de.xx.service.TestServiceLocal - EJB3.x Local Business Interface
 
Hi,

die injection findet erst statt nach dem die ManagedBean initialisiert wird. Also ist der Aufruf im Konstrukor immer NULL! -> d.h. erst in der @PostConstruct Methode den Aufruf verwenden!

+ du hast vergessen in der web.xml

Code:
 <context-param>
  <param-name>com.sun.faces.injectionProvider</param-name>
  <param-value>org.jboss.web.jsf.integration.injection.JBossScanningInjectionProvider</param-value>
 </context-param>

+ soll laut Spec. die Perfomance der JSF-Anwendung steigern

Code:
<context-param>
  <param-name>com.sun.faces.serializationProvider</param-name>
  <param-value>org.jboss.web.jsf.integration.serialization.JBossSerializationProvider</param-value>
 </context-param>
 <context-param>


Greetz
 
Hi,

die injection findet erst statt nach dem die ManagedBean initialisiert wird. Also ist der Aufruf im Konstrukor immer NULL! -> d.h. erst in der @PostConstruct Methode den Aufruf verwenden!

Das mit dem Konstruktor war nur ein Versuch da er ins @PostConstruct gar nicht reinging.

Ok, habe nun
[xml]
<context-param>
<param-name>com.sun.faces.injectionProvider</param-name>
<param-value>org.jboss.web.jsf.integration.injection.JBossScanningInjectionProvider</param-value>
</context-param>
[/xml]
in der web.xml hinzugegeben, Erfolg hat es leider keinen gebracht - er geht mir einfach nicht in die @PostConstruct Methode (init()) ..

Vllt. liegt es am JBoss 6?
LT. Google benötigt man die common-annotations.jar für @PostConstruct - selbige liegt unter WEB-INF/lib - kann es also auch nicht sein.
faces-config.xml sowie web.xml Kopf passt?
 
Zuletzt bearbeitet:
Hi,

kopier mal die jboss-faces.jar in dein WEB-inf/lib Verzeichnis und probiere es nochmal!

die lib findest du unter default/deploy/jbossweb.sar/jsf-libs.jar

das hat bei mir zum Erfolg geführt!

Ich arbeite noch mit JBoss 5 d.h. liegen in meinem WEB-INF/lib Verzeichnis die JSF 2.0 Libs -> falls du auch eine eigene JSF Version im Projekt verwendest und nicht die vom JBoss dann noch zusätzlich:


Code:
<context-param>
  <param-name>org.jboss.jbossfaces.JSF_CONFIG_NAME</param-name>
  <param-value>Mojarra-2.0</param-value>
 </context-param>
 <context-param>
  <param-name>org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL</param-name>
  <param-value>true</param-value>
 </context-param>


Greetz
 
was unter jboss/server/default/deploy/jbossweb.sar/jsf-libs liegen keine JSF libs???????

ich arbeite zwar noch mit dem JBoss 5.1 aber irgendwie kann das nicht ganz hinauen... ich lade mir das teil mal runter.... mom
 
ok... hattest recht!

das ganze liegt jetzt in server/default/deployers/jsf-deployer/Mojarra-2.0/

dann kopier dir mal aus dem Verzeichnis die jboss-faces.jar in dein WEB-INF/Lib Verzeichnis...
 
Danke für deinen Einsatz!

Die von dir gewünschte JAR habe ich nun ins WEB-INF/lib Verzeichnis kopiert leider ohne Erfolg..
 
Ich persönlich würde davon ausgehen, dass ich nicht der Erste bin, der mit JBoss 6.0.0 (final) ein EJB verwendet und mir somit auffällt, dass das Teil zwar JEE zertifiziert ist, aber es sich wohl durch die Zertifizierung gemogelt haben muss.

Somit würde ich von einem OSI-Layer-8 Problem ausgehen, vor dem schließlich niemand gefeit ist. Ich würde ein kleines, minimales Bean schreiben, deployen und sehen was passiert. Wenn es sich richtig verhält, würde ich langsam die Komplexität erhöhen, bis ich bei meinem Endergebnis angelangt bin. Entweder habe ich bis dahin meinen Fehler/Denkfehler entdeckt, oder ich habe ein sinnvolles Beispielprogramm, mit dem sich das Problem nachstellen lässt. Damit kann man dann einen Bug bei JBoss reporten.
 
Da du oben die Dependency angegeben hast, baust du mit maven? Du solltest nämlich den Scope dieser Dependency auf "provided" setzen, da diese sich ja im JBoss befindet.

Ansonsten habe ich dein Beispiel einmal nachgebaut und bei mir funktioniert das so einwandfrei.
 
Da du oben die Dependency angegeben hast, baust du mit maven? Du solltest nämlich den Scope dieser Dependency auf "provided" setzen, da diese sich ja im JBoss befindet.

Ansonsten habe ich dein Beispiel einmal nachgebaut und bei mir funktioniert das so einwandfrei.


Danke dir, die Dependencies bräuchte ich für Maven, aktuell läuft das ganze aber in Eclipse, sprich ich builde nicht selbst. Kann ich vllt das von dir nachgebaute Projekt mal haben?

Kann man beim JBoss eigentlich umstellen ob PARENT FIRST oder PARENT LAST?
 
Zuletzt bearbeitet:
Klar, siehe Anhang.

Ich hab es jetzt wohl als Maven Projekt und dann über die JBoss Admin Console deployed, da ich keinen Eclipse Adapter für JBoss AS 6 auf die schnelle installieren wollte.
 

Anhänge

@mvitz
Habe mittels Maven grad ein EAR deines Projekts erzeugt und es funktioniert, umso mehr bin ich ratlos wo ich gefailed habe (eventuell die Eclipse Wizards?)
 
Konnte mittlerweile das Problem lokalisieren und beheben.
Im Detail hat mir Eclipse (Dynamic Web Project) ein paar JARs ins WEB-INF/libs Verzeichnis gelegt welche störend waren, selbige löschen und @PostConstruct wird aufgerufen.

Danke für eure Hilfe.
 

Neue Themen


Zurück
Oben