JSF: NameNotFoundException

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi zusammen,

bei mir tritt folgender Fehler auf, wenn ich bei meiner jsf-Seite einen Handler einbauen möchte, den ich mir nicht erklären kann.

Der Handler:

Code:
public class MyHandler {
	//Die Bean
	private MyBean myBean;
	
	//Die konkrete Implementierung des Service
	@EJB
	private MyService myService;
	
	//JSF-Injection
	
	//Die Bean
	public void setMyBean(MyBean myBean ) {
		this.myBean= myBean;
	}
	
	public myBean getMyBean()
	{
		return this.myBean;
	}

                //Logik-Methoden

Meine faces-config.xml:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="1.2" 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_1_2.xsd">
 <managed-bean>
  <managed-bean-name>myHandler</managed-bean-name>
  <managed-bean-class>test.MyHandler</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
  <managed-property>
   <property-name>myBean</property-name>
   <value>#{bug}</value>
  </managed-property>
 </managed-bean>
 <managed-bean>
  <managed-bean-name>myBean</managed-bean-name>
  <managed-bean-class>test.MyBean</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
 </managed-bean>
</faces-config>

Die Fehlermeldung:
Code:
javax.naming.NameNotFoundException: test.MyHandler not bound
	at org.jnp.server.NamingServer.getBinding(NamingServer.java:529)
	at org.jnp.server.NamingServer.getBinding(NamingServer.java:537)
	at org.jnp.server.NamingServer.getObject(NamingServer.java:543)
	at org.jnp.server.NamingServer.lookup(NamingServer.java:267)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:667)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627)
	at javax.naming.InitialContext.lookup(Unknown Source)
	at org.apache.catalina.util.DefaultAnnotationProcessor.lookupFieldResource(DefaultAnnotationProcessor.java:203)
	at org.apache.catalina.util.DefaultAnnotationProcessor.processAnnotations(DefaultAnnotationProcessor.java:139)
	at org.jboss.web.jsf.integration.injection.JBossInjectionProvider.inject(JBossInjectionProvider.java:104)
	at com.sun.faces.config.ManagedBeanFactoryImpl.newInstance(ManagedBeanFactoryImpl.java:298)
	at com.sun.faces.application.ApplicationAssociate.createAndMaybeStoreManagedBeans(ApplicationAssociate.java:527)
	at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:82)
	at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
	at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:64)
	at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:45)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:86)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:101)
	at javax.faces.component.UIData.getValue(UIData.java:582)
	at javax.faces.component.UIData.getDataModel(UIData.java:1063)
	at javax.faces.component.UIData.setRowIndex(UIData.java:417)
	at com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:85)
	at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:788)
	at javax.faces.component.UIData.encodeBegin(UIData.java:879)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:884)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:137)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:812)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)
	at com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:245)
	at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:176)
	at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
	at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:189)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:147)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:276)
	at org.ajax4jsf.Filter.doFilter(Filter.java:175)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
	at java.lang.Thread.run(Unknown Source)

Habe ich einen falschen Eintrag in der faces-config.xml gemacht? Selbst mit dem KSKB finde ich keinen Fehler. Seht ihr einen?
 
G

Guest

Gast
Muss noch auf das EJB in der faces-config.xml referenziert werden?
 
G

Guest

Gast
Meinst du die Variable "myService", welche per @EJB annotiert ist?
Sie wird einfach weiterhin mit myService angesprochen und verwendet.

Es gibt folgende Methode in der Klasse "MyHandler":

Code:
public void createSomething()
{
 myService.createSomething()
}

Das wars. Keine weitere Initialisierung von "myService".
 

HLX

Top Contributor
Das meinte ich nicht. Schließlich wird MyHandler nicht gefunden - MyService scheint zunächst mal außen vor. Irgendwo musst du MyHandler in der Anwendung deklariert haben. Damit hängt möglicherweise das Problem zusammen. Wo wendest du also die Bean MyHandler an?
 
G

Guest

Gast
In meiner JSF-Seite wird MyHandler wie folgt verwendet (auf das Wesentliche reduziert):

Code:
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>

<html>
    <head>
    	<title>Title</title>
    </head>
    <body>

	<f:view>
		<h:messages style="color: red"/>
    	<h:form id="myForm">
    	<h:panelGrid columns="2">
    		<h:outputText value="BugID:"/>
    		<h:inputText size="30" id="bugId" value="#{myBean.myId}" required="true">
	    		<f:validateLength maximum="5" minimum="1"/>
    		</h:inputText>
    		<h:outputText value=""/>
		 	<h:commandButton action="#{myHandler.createSomething}" value="Bug suchen!" />
                                </body>
</html>
 
G

Guest

Gast
</f:view>

Fehlt hier natürlich. Hmm, also an der falschen Rechtschreibung dürfte es eigentlich nicht liegen, da diese mit der faces-config.xml übereinstimmt.
 
G

Guest

Gast
Darüber hinaus habe ich bereits in Eclipse das Projekt über Project-Clean... bereinigt. Ebenfalls ohne Erfolg. Auch ein Neustart des Servers brachte keinen Erfolg.
 

HLX

Top Contributor
Mich wundert, dass in der Exception der Klassenname und nicht der "managed-bean-name" angegeben ist. Die Anwendung sucht scheinbar eine Bean mit dem Namen "test.MyHandler". Der Name der Bean ist allerdings "myHandler". Kann es sein, dass du an anderer Stelle den Falschen Namen eingesetzt hast?
 
G

Guest

Gast
Ich habe mal in meiner "MyBean" eine Konsolenausgabe in dem Konstruktor ausgegeben. Die Konsolenangabe wird nicht ausgegeben:

Code:
@Stateless(name = "MyBean")
@TransactionManagement (TransactionManagementType.CONTAINER)
@TransactionAttribute (TransactionAttributeType.REQUIRED)
public class MyBean implements MyService{

	@EJB
	private MyDao dao;
	
	public BugServiceBean()
	{
		System.out.println("=========================================");
		System.out.println("Konstruktor der MyBean betreten!");
		System.out.println("=========================================");
	}
	public MyBean createSomething(Integer id) throws MyServiceException, SQLException {
		if (id.toString().length() > 5)
			throw new BugServiceException("Eine ID darf nur maximal 5 Zeichen enthalten!");
		MyBean account = new MyBean(id);
		this.dao.createSomething(id);
		return account;
	}

}

Normalerweise muss doch der Konstruktor der MyBean aufgerufen werden.
Zur Info: MyService ist ein Remote-Interface.
Ich arbeite mit dem JBoss-Server.

Ist vielleicht die Annotation von MyService in "MyHandler" falsch?

Code:
//Die konkrete Implementierung des Service 
   @EJB 
   private MyService myService;
 
G

Guest

Gast
Ich verwende MyHandler nur in der aufgerufenen JSF-Seite. MyHandler ist lediglich in faces-config.xml deklariert.
 
G

Guest

Gast
Vor der eigentlichen Exception wird noch folgendes ausgegeben:

Code:
[JBossInjectionProvider] Injection failed on managed bean

Leider kann ich mit dieser Info relativ wenig anfangen.
 
G

Guest

Gast
Eines verstehe ich nicht:

@EJB
private Calculator calculator;
@EJB(beanName="org.jboss.tutorial.injection.bean.CalculatorBean")
public void setCalculator(Calculator c)
{
set = c;
}

Wieso muss ich explizit den Calculator setzen? Muss dann der Calculator auch in der faces-config.xml eingetragen werden?

Normalerweise wird doch der JNDI-Lookup ausgeführt oder?
 

HLX

Top Contributor
Anonymous hat gesagt.:
Eines verstehe ich nicht:

@EJB
private Calculator calculator;
@EJB(beanName="org.jboss.tutorial.injection.bean.CalculatorBean")
public void setCalculator(Calculator c)
{
set = c;
}

Wieso muss ich explizit den Calculator setzen? Muss dann der Calculator auch in der faces-config.xml eingetragen werden?

Normalerweise wird doch der JNDI-Lookup ausgeführt oder?

Du musst den Calculator nicht setzen. Das Tutorial hat zwei verschiedene Anwendungsfälle beschrieben:
Tutorial hat gesagt.:
You are not limited to injecting dependencies on fields. You can also use @EJB on a setter method
 
G

Guest

Gast
In der verwendeten Methode muss folgendes angegeben werden (so in etwa, hab die Sourcen auf der Arbeit ;)):

Code:
public void doSomething()
{
    InitialContext ctx = new InitialContext();
    MyService service = (MyService) ctx.lookup("JNDIName angeben");
    service.doSomething();
}

Der JNDI-Lookup per @EJB-Annotation funktioniert beim JBoss hierbei nicht. Man erhält immer eine NullPointerException. Die Suche nach der Lösung hat mich einiges an Nerven gekostet.
Schön ist diese Lösung sicherlich nicht. Allerdings muss man bedenken, dass der JBoss von Sun, nicht wie z.B. Glassfish, zertifiziert ist.
Vielen Dank für die Hilfe.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G jboss - NameNotFoundException Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben