Problem beim JNDI remote Access von Tomcat nach JBoss

thomas2004ch

Grünschnabel
Habe ein klines Programm geschrieben nach einem Tutor "http://trailblazer.demo.jboss.com/EJB3Trail/persistence/index.html".

Das Programm besteht aus einem EJB-Projekt (JAR) und einem Web-Projekt (WAR). Die beiden funtionieren ganz gut auf JBoss 4.2.2 Server.

Nun habe ich das Web-Projekt (WAR) auf Tomcat 6 deployt. Als ich versuche meine Seite aufzurufen, kriege ich Exception, dass irgendwie bei JNDI binding nicht funktionieren.

Hier sind Exceptionmeldung aus dem Browser:
Code:
org.apache.jasper.JasperException: An exception occurred processing JSP page /addfund.jsp at line 46

43: <br />
44: 
45: <%
46: 	 Collection <Fund> funds = cal.getFunds();
47: 
48: %>
49:

Hier sind die Excption-Meldung aus Tomcat Console:
Code:
INFO: Deploying web application archive TestJBossEJB3Web.war
javax.naming.NameNotFoundException: Name EntityCalculator is not bound in this C
ontext
        at org.apache.naming.NamingContext.lookup(NamingContext.java:770)
        at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
        at org.apache.naming.SelectorContext.lookup(SelectorContext.java:137)
        at javax.naming.InitialContext.lookup(InitialContext.java:351)
        at org.apache.jsp.addfund_jsp.jspInit(addfund_jsp.java:21)
        at org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:51)
        at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrap
per.java:159)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper
.java:329)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:3
20)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV
alve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV
alve.java:175)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j
ava:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j
ava:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal
ve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav
a:263)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java
:844)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.proce
ss(Http11Protocol.java:584)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:44
7)
        at java.lang.Thread.run(Thread.java:595)

Meine JSP-Seite sieht so aus:
Code:
...
<%!private Calculator cal = null;
	private NumberFormat nf = null;

	public void jspInit() {
		try {
			InitialContext ctx = new InitialContext();
			cal = (Calculator) ctx.lookup("EntityCalculator/remote");
		} catch (Exception e) {
			e.printStackTrace();
		}

		nf = NumberFormat.getInstance();
		nf.setMaximumFractionDigits(2);
	}%>

<%
	if ("AddFund".equals(request.getParameter("action"))) {
		cal.addFund(request.getParameter("fundname"), Double
				.parseDouble(request.getParameter("fundrate")));
	}
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Insert title here</title>
</head>
<body>
<p>Add a new Fund:<br />
<form action="addfund.jsp" method="POST">Fund Name : <input
	type="text" name="fundname" value=""> Growth rate : <input
	type="text" name="fundrate" value="0.05"><input type="hidden"
	name="action" value="AddFund"><br />
<input type="submit" value="Add fund"><INPUT type="button"
	value="Close Window" onClick="window.close()"></form>
<br />

<%
	 Collection <Fund> funds = cal.getFunds();

%>

Hat jemand Erfahrung?

Gruß

Thomas
 
Scheinbar gehen da mehrere Dinge durcheinander. Ich dacht auf den ersten Blick, das Tutorial wäre ein reines EntityBean Tutorial. Dann hätte der Tomcat mit den entsprechenden JPA Libraries auch ausgereicht.

Das Tutorial arbeitet aber mit SessionBeans. D.h. es ist ein vollständiger EJB Containter von Nöten. Den bringt der Tomcat aber nicht mit. Du musst also - wenn du das Tutorial so durchmachen willst - auf einen JBoss oder Glassfish zurückgreifen.

Desweiteren kannst du SessionBeans auch nicht einfach in einem WAR deployen. Das Deploymentformat für Session und MessageDriven Beans isr EAR (wird auch explizit im Tutorial erwähnt).

Was den Wust kompett macht ist dein JNDI Lookup in einer JSP. Das ist grober Foo. Angenommen du hast jetzt einen JBoss und ein EAR mit den SessionBeans deployt, dann solltest du die Daten in einem Servlet vorbereiten. In dieses kannst du dir nämlich die SessionBean mit @EJB injizieren lassen ohne einen manuellen Lookup zu machen. Eigentlich kannst du dir dann auch die SessionBean sparen und dir einfach die EntityManagerFactory per @PersistenceUnit(name=deinePersistenceUnit) geben lassen, dir daraus einen EntityManager ziehen und die EntityBeans direkt verwenden.

Das hätte auch den Vorteil, dass du keine SessionBeans mehr brauchst und somit auch keinen JBoss. Servlets und EntityBeans laufen auch problemlos in einem Tomcat.

So its your choice... alle Klarheiten beseitigt? ;)

REINHAUN!
 
Hallo,

zuerst danke für die nette Antwort.

Aber ich glaube vielleicht hast Du meine Situation nicht ganz verstanden. :)

Ich habe zuerst das JAR und WAR auf JBoss Server deployt und es funtioniert gut.

Nun möchte ich das WAR nicht auf JBoss sonder auf Tomcat deploymen. Aber da habe ich Problem mit JNDI-Lookup. Ich glaube da fehlt mir noch was, entweder bei der Konfiguration oder in den Codes.
 
Hm, dass das reine JAR deployment im JBoss funktioniert wundert mich. Aber scheinbar geht das wirklich. Willst du den Tomcat des JBoss benutzen oder ist das eine extra Serversinstanz? Ich vermute der Lookup passiert im JNDI des Tomcat, während die Bean ja nur im JNDI des JBoss registriert ist.

Gruß
Ollie
 
Früher muß man das JAR in EAR einpacken. Heuzutage bei vielen neuen App-Serverversion kann man einfach das JAR deployment und es funktioniert. :)

Mein Tomcat ist eine extra Serversinstanz. Diese Konstellation ist auch sehr üblich. Man deployt das EAR/JAR auf einen Server und das WAR auf anderem oder sogal mehreren Server.
 
*gg* naja üblich ist sicher das falsche Wort. Um sowas anzufangen braucht man meiner Meinung nach schon SEHR gute Gründe. Denn das macht aus jedem lokalen Aufruf zwischen Frontend und Backend zu einen Remoteaufruf mit all seinen negativen Konsequenzen (bedenke Martin Fowler's first rule of distributed objects: "Don't do it!" ;)). Da zu denken, man könnte mal eben on the fly einen Teil der Anwendung auf ne andere Kiste schieben ist eher naiv als optimistisch. Noch weniger üblich sind JNDI Lookups aus JSPs heraus ;).

Zum Thema: du musst wohl deinem Lookup die Remotemaschine als Property mitgeben, siehe hier.

Gruß
Ollie
 

Neue Beiträge

Zurück