EJB3 mit JBoss Eclipse IDE

Germu

Mitglied
Hallo,

Muss mich zur Zeit für ein Projekt in EJB3.0 einarbeiten. Ich benutze dafür den JBoss App. Server und die JBoss Eclipse IDE. Arbeite mit dem Buch "Enterprise JavaBeans 3.0 - 5th Edition" von O'Reilly.

Hab mir in Eclipse ein EJB 3.0 Projekt angelet und darin folgende Klassen erstellt:

CabinBean (meine Entity Bean Klasse)
Code:
package com.titan.domain;

import javax.persistence.*;

@Entity
@Table(name="Cabin") 
public class CabinBean implements java.io.Serializable{
	
	private static final long serialVersionUID = 1L;

	private int id;
	private String name;
	private int deckLevel;
	private int shipId;
	private int bedCount;
	
	@Id 
	@Column(name="ID")

	public int getId() {return this.id;}
	public void setId(int id) {this.id = id;}
	
	@Column(name="NAME")
	public String getName() { return this.name; }
	public void setName(String name) {this.name = name; }
	
	@Column(name="DECK_LEVEL")
	public int getDeckLevel() { return this.deckLevel; }
	public void setDeckLevel(int deckLevel) { this.deckLevel = deckLevel; }
	
	@Column(name="SHIP_ID")
	public int getShipId() { return this.shipId; }
	public void setShipId(int shipId) {this.shipId = shipId; }
	
	@Column(name="BED_COUNT")
	public int getBedCount() { return this.bedCount; }
	public void setBedCount(int bedCount) { this.bedCount = bedCount; }	
}

TravelAgentBean & TravelAgentRemote
(Session Bean + Remote Interface)
TravelAgentRemote:
Code:
package com.titan.travelagent;

import javax.ejb.Remote;

import com.titan.domain.CabinBean;

@Remote 
public interface TravelAgentRemote {	
		
	public void CreateCabin(CabinBean cabin);
	public CabinBean findCabin(int id);
}
TravelAgentBean:
Code:
package com.titan.travelagent;

import javax.ejb.Stateless;
import javax.persistence.*;

import com.titan.domain.CabinBean;

@Stateless
public class TravelAgentBean implements TravelAgentRemote{

	@PersistenceContext(unitName="titan")
	private EntityManager manager;		
	
	public void CreateCabin(CabinBean cabin) {
		manager.persist(cabin);
	}

	public CabinBean findCabin(int id) {
		return manager.find(CabinBean.class, id);
	}
}

dann hab ich noch eine Client Klasse mit der main:

Code:
package com.titan.client;

import java.awt.GridLayout;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import com.titan.domain.CabinBean;
import com.titan.travelagent.TravelAgentRemote;

public class Client extends JFrame{

	private static final long serialVersionUID = 1L;

	public static void main(String [] args) {
    	try
    	{
    			Context jndiContext = getInitialContex();
    			Object ref = jndiContext.lookup("TravelAgentBean/remote");
    			TravelAgentRemote dao = (TravelAgentRemote)
    				PortableRemoteObject.narrow(ref, TravelAgentRemote.class);
    			
    			CabinBean cabin_1 = new CabinBean();
    			cabin_1.setId(1);
    			cabin_1.setName("Master Suite");
    			cabin_1.setDeckLevel(1);
    			cabin_1.setShipId(1);
    			cabin_1.setBedCount(3);
    			
    			dao.CreateCabin(cabin_1);
    			
    			CabinBean cabin_2 = dao.findCabin(1);
    			System.out.println(cabin_2.getName());
    			System.out.println(cabin_2.getDeckLevel());
    			System.out.println(cabin_2.getShipId());
    			System.out.println(cabin_2.getBedCount());
       	}
    	catch (javax.naming.NamingException ne)
    	{
    		ne.printStackTrace();
    	}
    }

	private static Context getInitialContex()
		throws javax.naming.NamingException
	{
		return new javax.naming.InitialContext();
	}
}

Wen man alle Klassen erstellt hat sollte man eine persistence.xml anlegen mit dem folgenden inhalt:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<persistence>
	<persistence-unit name="titan">
		<jta-data-source>java:/Titan/DB</jta-data-source> 
	</persistence-unit>
</persistence>

Nun sollte man die Klassen: CabinBean, TravelAgentRemote und TravelAgentBean zusammen mit der persistence.xml zu einem jar Archiv zusammenfassen.

Wen ich jetzt die Jar Datei zu meinem JBoss Server Deploye bekomm ich folgende Fehlermeldung in der Konsole vom Server:

Code:
11:00:20,469 ERROR [PersistenceXmlLoader] Error parsing XML: XML InputStream(8) The processing instruction target matching "[xX][mM][lL]" is not allowed.
11:00:20,484 WARN  [ServiceController] Problem creating service jboss.j2ee:service=EJB3,module=titan.jar
org.xml.sax.SAXParseException: The processing instruction target matching "[xX][mM][lL]" is not allowed.
	at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
	at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
	at org.hibernate.ejb.packaging.PersistenceXmlLoader.loadURL(PersistenceXmlLoader.java:64)
	at org.hibernate.ejb.packaging.PersistenceXmlLoader.deploy(PersistenceXmlLoader.java:73)
	at org.jboss.ejb3.Ejb3Deployment.initializePersistenceUnits(Ejb3Deployment.java:444)
	at org.jboss.ejb3.Ejb3Deployment.create(Ejb3Deployment.java:307)
	at org.jboss.ejb3.Ejb3Module.createService(Ejb3Module.java:77)
	at org.jboss.system.ServiceMBeanSupport.jbossInternalCreate(ServiceMBeanSupport.java:260)
	at org.jboss.system.ServiceMBeanSupport.jbossInternalLifecycle(ServiceMBeanSupport.java:243)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
	at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
	at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
	at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
	at org.jboss.system.ServiceController$ServiceProxy.invoke(ServiceController.java:978)
	at $Proxy0.create(Unknown Source)
	at org.jboss.system.ServiceController.create(ServiceController.java:330)
	at org.jboss.system.ServiceController.create(ServiceController.java:273)
	at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
	at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
	at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
	at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
	at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
	at $Proxy46.create(Unknown Source)
	at org.jboss.ejb3.EJB3Deployer.create(EJB3Deployer.java:429)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
	at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
	at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
	at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)
	at org.jboss.mx.interceptor.DynamicInterceptor.invoke(DynamicInterceptor.java:97)
	at org.jboss.system.InterceptorServiceMBeanSupport.invokeNext(InterceptorServiceMBeanSupport.java:238)
	at org.jboss.ws.server.WebServiceDeployer.create(WebServiceDeployer.java:99)
	at org.jboss.deployment.SubDeployerInterceptorSupport$XMBeanInterceptor.create(SubDeployerInterceptorSupport.java:180)
	at org.jboss.deployment.SubDeployerInterceptor.invoke(SubDeployerInterceptor.java:91)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
	at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
	at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
	at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
	at $Proxy47.create(Unknown Source)
	at org.jboss.deployment.MainDeployer.create(MainDeployer.java:953)
	at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:807)
	at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:771)
	at sun.reflect.GeneratedMethodAccessor12.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
	at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
	at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
	at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
	at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
	at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
	at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
	at $Proxy6.deploy(Unknown Source)
	at org.jboss.deployment.scanner.URLDeploymentScanner.deploy(URLDeploymentScanner.java:421)
	at org.jboss.deployment.scanner.URLDeploymentScanner.scan(URLDeploymentScanner.java:610)
	at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.doScan(AbstractDeploymentScanner.java:263)
	at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.loop(AbstractDeploymentScanner.java:274)
	at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.run(AbstractDeploymentScanner.java:225)
11:00:20,484 INFO  [EJB3Deployer] Deployed: file:/C:/Programme/jboss-4.0.4.GA/server/default/deploy/titan.jar
11:00:20,484 ERROR [URLDeploymentScanner] Incomplete Deployment listing:

--- MBeans waiting for other MBeans ---
ObjectName: jboss.j2ee:service=EJB3,module=titan.jar
  State: FAILED
  Reason: org.xml.sax.SAXParseException: The processing instruction target matching "[xX][mM][lL]" is not allowed.

--- MBEANS THAT ARE THE ROOT CAUSE OF THE PROBLEM ---
ObjectName: jboss.j2ee:service=EJB3,module=titan.jar
  State: FAILED
  Reason: org.xml.sax.SAXParseException: The processing instruction target matching "[xX][mM][lL]" is not allowed.

Wen ich die Client Klasse ausführe bekomm ich immer diese Fehlermeldung:
Code:
javax.naming.NameNotFoundException: remote 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:296)
	at org.jnp.server.NamingServer.lookup(NamingServer.java:270)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
	at sun.rmi.transport.Transport$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
	at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
	at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
	at sun.rmi.server.UnicastRef.invoke(Unknown Source)
	at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:625)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:587)
	at javax.naming.InitialContext.lookup(Unknown Source)
	at com.titan.client.Client.main(Client.java:27)

Spiel jetzt schon 2 Tage damit rum und komm einfach auf keinen grünen Zweig. Wäre nett wen mir jemand helfen könnte.

grüsse
Germu
 
Hallo!

Ich beschäftige mich auch schon seit Tagen mit diesem Frickelkram (ich schätze ich bekomme mit 25 graue Haare deswegen...).

Wie hast du es gelöst bekommen? Erstellst du deine EAR oder JAR mit ANT, oder über Eclipse Export? Oder kannst du direkt zu Eclipse deployen?

Ich hab voll den Knoten im Kopf und bekomm gerade gar nix mehr hin...
 
hallo!

beschaeftige mich zwar auch erst seit kurzen mit dem thema...aber der verweis auf die datasource sieht meiner meinung ein wenig merkwuerdig aus

PHP:
<jta-data-source>java:/Titan/DB</jta-data-source>

ich hab das bisher meist nur in folgender form gesehen:
PHP:
<jta-data-source>java:/DefaultDS</jta-data-source>
 
Das kommt ganz darauf an, wie du das konfiguriert hast. Bei mir sieht das zum Bleistift so aus:

Java:
<jta-data-source>java:/PostgresDS</jta-data-source>

Kommt halt auf den Eintrag in der entsprechenden *-ds.xml an:
Java:
<datasources>
  <local-tx-datasource>
    <jndi-name>PostgresDS</jndi-name>
    <connection-url>jdbc:postgresql:// [...]
 
Hallo allerseits,

beschäftige mich auch zur Zeit mit dem Thema und habe genau dasselbe Problem an derselben Stelle - nämlich "not bound"-Fehlremeldung. Was ist nun daraus geworden? Habt Ihr die Lösung gefunden?
 
Hallo noch mal,

meiner Code entspricht genau dem, was Germu gepostet hat, und die Datei persistence.xml ist dementsprechend korrigiert. Ich habe das ganze als Eclipse-Projekt gemacht. Alles in einem Projekt. Ich lasse eine EAR-Datei erzeugen und die wird ganz brav deployed. Dann starte ich die Anwendung und sofort bekomme folgendes:

HTML:
javax.naming.NameNotFoundException: TravelAgentBean not bound
	at org.jnp.server.NamingServer.getBinding(NamingServer.java:514)
	at org.jnp.server.NamingServer.getBinding(NamingServer.java:522)
	at org.jnp.server.NamingServer.getObject(NamingServer.java:528)
	at org.jnp.server.NamingServer.lookup(NamingServer.java:252)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
	at sun.rmi.transport.Transport$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
	at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:247)
	at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:223)
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:126)
	at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:610)
	at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:572)
	at javax.naming.InitialContext.lookup(InitialContext.java:351)
	at com.titan.clients.Client.main(Client.java:20)

Was mache ich falsch? Bin, um ehrlich zu sein, mit meiner Weisheit am Ende.
 
Hi!

ich bin auch gerade dabei EJB 3.0 zu begreifen ...

Du scheinst dein RemoteInterface nicht eingebunden zu haben.
im statelessbean sollte stehen,
@Remote(TravelAgentRemote.class) das in Klammern kann man auch weglassen. Nur bei Local, und nur, wenn es das einzige Business Interface ist kann die Annotation wegfallen; meine ich zumindest.
Mir scheint der parameterlose Konstruktor in der BeanKlasse zu fehlen, der wird gebraucht damit der EJB Container eine Instanz der Klasse bauen kann.
Ich finde auch gar keinen EntityManager ...
Naja, ich arbeite mich auch gerade ein und habe so meien Probleme :)

Viel Glück!
Holger
 
Hallo Holger,

doch, RemoteInterface ist eingebunden. Habe gerade noch mal geprüft, die Annotation steht wo sie auch stehen soll. :-)
 
Hallo,

Ich habe dasselbe versucht und ähnliche Probleme angetroffen. Die Session bean ergab auch mehreremals Probleme, indem ich ant clean und ant clean.de aufgerufen hatte, konnte die session bean jedoch deployed werden.

Zudem gab es auch das Problem mit dem Context, das jndi.properties file konnte nicht gefunden werden. Ich habe eine Workaround gefunden (beschrieben in http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=11&t=014529) ,aber noch nicht die definitive Lösung. Falls Ihr weitergekommen seid, würde mich Eure Lösung sehr interessieren

mit besten Grüssen

Markus
 
Zurück