# Probleme beim Methodenaufruf einer EJB



## guest (3. Sep 2008)

Hallo Zusammen,

ich hätte da ein Problem. Ich versuche zurzeit über eine Client Anwendung eine Methode aus einer EJB aufzurufen die mir ein ArrayList zurückgeben soll.

Bekomme dabei aber immer eine NotSerializable Exception. Weiß jemand von euch vielleicht woran das liegt? 

Bei der Methode die mir einen String zurückliefert funktioniert das nämlich alles einwandfrei.

*Hier der Quellcode für den Aufruf der EJB:*

try {

//			   Create a new intial context, which loads from jndi.properties file.

			   String contextFactory = "com.sap.engine.services.jndi.InitialContextFactoryImpl";
			   System.out.println ("contextfactory" + contextFactory );
			   Properties properties = new Properties();
			   properties.put(Context.INITIAL_CONTEXT_FACTORY, contextFactory);
			   //properties.put("force_remote", "true");
			   properties.put(Context.PROVIDER_URL, "server_url");
			   properties.put(Context.SECURITY_PRINCIPAL, "user");
			   properties.put(Context.SECURITY_CREDENTIALS, "password");


			Context ctx = new InitialContext(properties);

//			   Look up the home interface using the JNDI name.

//			   This JNDI lookup returns a reference to an EJBHome instance.

			TestHome home = (TestHome) ctx.lookup("TestWorldEar/TestBean"); 

//			   Create a session object.

			remote = home.create();

//			   Invoke the remote EJB methods, test and debug.

			System.out.println("Result1:" + remote.getWert()); //String

***Hier tritt die NotSerializable Exception auf *****

			System.out.println("Result2:" + remote.getMessage()); //ArrayList


			}  catch  (Exception e) {

			System.out.println("Exception: " + e.getLocalizedMessage());

			}

Danke für alle Antworten im Voraus!!!


----------



## maki (3. Sep 2008)

Die Objekte in der ArrayList, sind die Serialisierbar?


----------



## guest (3. Sep 2008)

Die ArrayList an sich implementiert ja schon das Serializable Interface.


----------



## maki (3. Sep 2008)

Ich habe nicht nach der ArrayList gefragt, sondern nach den Objekten darin, wirst ja wohl kaum eine leere ArrayList schicken...


----------



## guest (3. Sep 2008)

Denke schon! Die Objekte drin sehen wie folgt aus:

try {


			InitialContext ctx = new InitialContext();
			DataSource ds = (DataSource) ctx.lookup("jdbc/SR3DB");
			Connection con = ds.getConnection();
			PreparedStatement stmt = con.prepareStatement("select * from XI_AF_MSG where MSG_ID = 'c943fe00-9f62-11dc-cb5d-000c29d9b012' ");
			ResultSet result = stmt.executeQuery();
			ResultSet erg = null;

					while (result.next()) 
					{

						row.add(result.getString("MSG_ID"));						
						row.add(result.getString("DIRECTION"));
						row.add(result.getString("REF_TO_MSG_ID"));
						row.add(result.getString("CONVERSATION_ID"));
						Integer sequenzNummer = new Integer(result.getInt("SEQUENCE_NBR"));
						row.add(sequenzNummer);
						row.add(result.getString("CONN_NAME"));
						row.add(result.getString("MSG_TYPE"));
						row.add(result.getString("STATUS"));
						row.add(result.getString("TO_PARTY_NAME"));
						row.add(result.getString("TO_PARTY_TYPE"));
						row.add(result.getString("FROM_PARTY_NAME"));
						row.add(result.getString("FROM_PARTY_TYPE"));
						row.add(result.getString("TO_SERVICE_NAME"));
						row.add(result.getString("TO_SERVICE_TYPE"));
						row.add(result.getString("FROM_SERVICE_NAME"));
						row.add(result.getString("FROM_SERVICE_TYPE"));
						row.add(result.getString("ACTION_NAME"));
						row.add(result.getString("ACTION_TYPE"));
						row.add(result.getString("DELIVERY_SEMANTICS"));
						row.add(result.getBlob("MSG_BYTES"));
						row.add(result.getTimestamp("SENT_RECV_TIME"));
						row.add(result.getTimestamp("TRAN_DELV_TIME"));
						row.add(result.getTimestamp("SCHEDULE_TIME"));
						row.add(result.getTimestamp("PERSIST_UNTIL"));
						Integer timesFailed = new Integer(result.getInt("TIMES_FAILED"));
						row.add(timesFailed);
						Integer retries = new Integer(result.getInt("RETRIES"));
						row.add(retries);						
						Long retryInterval = new Long(result.getLong("RETRY_INTERVAL"));
						row.add(retryInterval);
						row.add(result.getString("MSG_PROFILE"));
						row.add(result.getString("TRANSPORT"));
						row.add(result.getString("ADDRESS"));
						row.add(result.getString("CREDENTIAL"));
						row.add(result.getString("TRAN_HEADER"));
						row.add(result.getTimestamp("VALID_UNTIL"));
						Integer node = new Integer(result.getInt("NODE"));
						row.add(node);
						row.add(result.getString("ERROR_CODE"));
						row.add(result.getString("ERROR_CATEGORY"));
						row.add(result.getString("PP_USER"));
						row.add(result.getBlob("PP_HASH"));
						//}

					}
			table.add(row);			
			con.close();
			return table;
}


----------



## maki (3. Sep 2008)

Ich vermute dass table die ArrayList ist, aber was row ist weisst nur du


----------



## guest (3. Sep 2008)

row ist auch eine ArrayList


----------



## maki (3. Sep 2008)

Lass mal die 2 BLOBs weg zum testen.


----------



## guest (3. Sep 2008)

Hi Maki,

Danke für die Hilfe! Hattest recht. Diese Datentypen sind nicht alle Serializable.


----------



## maki (3. Sep 2008)

naja, man könnte die Daten an sich schon serialisieren, indem man sich den  stream holt (getBinaryStream) oder als byte array (getBytes).


----------



## guest (3. Sep 2008)

Danke für die Info. Das wird dann die Erweiterung.


----------

