Bizarre ClassCastException when sending serialized objects
I have two programs communicating with each other over a network using TCP and serialized objects. One of the programs uses an ObjectOutputStream to send the message, and the other uses an ObjectInputStream to receive it. The receiver has a thread that simply loops, receiving and processing messages one at a time.
Under normal circumstances, this works fine. However, sometimes the sender program has to send more than one message, one right after the other. I guess my assumption was that on the receiving end, they would somehow just "queue up" in the ObjectInputStream and the receiver would be able to read them one at a time. But instead, I get this bizarre ClassCastException whose message talks about members and objects from both messages that were sent. It is as though somehow the two objects received are being mangled together and interpreted somehow as one object. This is strange to me, since I am pretty sure TCP is supposed to guarantee in-order delivery of packets.
Can I not send multiple messages right after each other through an ObjectOutputStream and have them received in an ObjectInputStream? If not, what would be a good workaround?
If you need more details, it works like this. I have two classes that look like this:
class Class1 extends SerializableSuperclass
Member1 m1;
class Class2 extends SerializableSuperclass
Member2 m2;
}Sender sends an instance of Class1 and then immediately an instance of Class2. Receiver attempts to readObject() from the input stream and gets this exception:
Exception in thread "Thread-4" java.lang.ClassCastException: cannot assign instance of Class2 to field Class1.m1 of type Member1 in instance Class1
Isn't that bizarre? Two separate classes, and it is attempting to merge the two in some odd way.
How do I fix or work around this?
Thanks
These classes do not have those methods. They are simply message classes designed to hold data. Do you need to see the methods that call ObjectOutputStream's writeObject() and ObjectInputStream's readObject() methods?
The serializable superclass is there because it has other stuff including a field identifying the sender. It's basically a base message class.
Also, the member classes are serializable (serializability isn't the issue anyway; "class cast" is the issue).
Similar Messages
-
EJB3 Stateful:ClassCastException when casting the object returned in lookup
Hi,
I'm developing a web application that make use of EJB3 stateless and stateful beans. The application server is the Websphere Application Server 6.1.0.15 with the EJB3 Feature Pack installed and the web server is the IBM HTTP Server running in another machine.
The problem I'm facing is that for every stateful bean after the lookup, it throws a ClassCastExcption when casting the object returned. See part of the log below.
[7/13/08 3:15:48:869 CDT] 0000001c SystemErr R java.lang.ClassCastException: cannot cast class com.spcs.dsa.ejb.authenticationmanager._AuthenticationManager_Stub to class com.spcs.dsa.ejb.authenticationmanager._AuthenticationManager_Stub
at com.ibm.rmi.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:396)
at com.spcs.dsa.ejb.client.DsaEjbClient.getAuthenticationRemote(DsaEjbClient.java:37)
at com.spcs.dsa.action.NewCardAction.execute(NewCardAction.java:85)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
Please notice in the log above that the cast was done for the correct class.
Here is the java code:
AuthenticationManager auth =
(AuthenticationManager) javax.rmi.PortableRemoteObject.narrow(
context.lookup("com.spcs.dsa.ejb.authenticationmanager.AuthenticationManager"),
AuthenticationManagerStub.class);
This problem doesn't happen for statless beans. If you simply change the class to be stateless, this problem stop to happen.
If you run this code in a stand alone program, this problem doesn't happen. It only happen when running in the web server.
Does anybody know what should be done to solve this problem ??
Thanks,
Marcos.I'm not familiar with any specifics of IBM's implementation but from an EJB 3 spec perspective there is no need to use PortableRemoteObject.narrow() if you're retrieving an EJB 3.0 Remote Business interface, regardless of the component type( stateful vs. stateless). In addition, the "_Stub" class should never have to be part of your client programming model. That should be hidden within the vendor's implementation, if present at all.
If AuthenticationManager is the Remote 3.0 Business Interface
@Remote
public interface AuthenticationManager {
your client lookup should be :
AuthenticationManager am = (AuthenticationManager) context.lookup("..."); -
Continuously send serialized objects from servlet
Hi,
I'm trying to write a servlet that, once activated, will continuously send objects back to a thread in the client. I'm hoping someone can point me in the right direction. This code works fine if you take out the while(true){...} loops.
After doing a bit more research, I discovered the OutputObjectStream should be .reset() in order to reset the object map. I tried doing this before the .flush() with no success. The servlet continues to spew out objects, but the client side doesn't even see the first one, hanging on the in = DataInputStream(connection.getInputStream()) line.
Servlet code:
public class testStream extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
int[] somedata = new int [1];
somedata [0] = 1000;
String contentType =
"application/x-java-serialized-object";
response.setContentType(contentType);
ObjectOutputStream out =
new ObjectOutputStream(response.getOutputStream());
while (true) {
try {
out.writeObject(somedata );
System.out.println("Sent " + somedata [0]);
somedata [0]++;
} catch(Exception ie) {}
out.flush();
Thread.yield();
out.close(); // unreachable if while loop in place
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
Applet side code:
* <P>
* Taken from Core Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
* http://www.coreservlets.com/.
* � 2000 Marty Hall; may be freely used or adapted.
public class testStream implements Runnable {
private boolean isDone = false;
private URL dataURL;
public testStream(String urlSuffix, URL currentPage) {
try {
// Only the URL suffix need be supplied, since
// the rest of the URL is derived from the current page.
String protocol = currentPage.getProtocol();
String host = currentPage.getHost();
int port = currentPage.getPort();
dataURL = new URL(protocol, host, port, urlSuffix);
Thread imageRetriever = new Thread(this);
imageRetriever.start();
} catch(MalformedURLException mfe) {
System.err.println("Bad URL");
isDone = true;
public void run() {
try {
retrieveImage();
} catch(IOException ioe) {
isDone = true; // will never get hit
public boolean isDone() { // meaningless now with infinite loop
return(isDone);
private void retrieveImage() throws IOException {
URLConnection connection = dataURL.openConnection();
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDefaultUseCaches (false);
connection.setRequestProperty("Content-Type", "application/x-java-serialized-object");
ObjectInputStream in = null;
try {
in = new ObjectInputStream(connection.getInputStream());
} catch (Exception pe) { System.err.println(pe); }
while (true) {
// loop forever requesting data
try {
// The return type of readObject is Object, so
// I need a typecast to the actual type.
int[] someData = (int[]) in.readObject();
System.err.println(someData[0]);
} catch(ClassNotFoundException cnfe) {
System.err.println("received NULL");
Thread.yield();try this: move out.flush() upwards directly after the out.writeObject().
robert -
Help!!! Sending serialized object to another server/servlet
I am trying to simply send a serialized bean to a servlet on another server. I have lot's of examples of doing this as a stream and recieving back a stream to output, trouble is, I want to do this as a means of communicating the state of a process from one application kicking off the process on the new application. So when the page is returned, I need to be located on the new server. Here is the stream code I'm using:
String strUrl = "http://www.myurl.net";
try {
URL url = new URL(strUrl);
HttpMessage msg = new HttpMessage(url);
BufferedReader in;
Object beanObj = (Object) myBean;
MyBean beany = (MyBean) beanObj;
in = new BufferedReader(new InputStreamReader(msg.sendPostMessage(beany)));
String inputLine;
while ((inputLine = in.readLine()) != null) {
out.println(inputLine + "\n");
in.close();
catch(IOException io) {
out.println("Unable to call the servlet " + io);
out.close();
How would I do this if I wanted to send and not come back to the original server?Why not create a little daemon to run on Server B (using the Servlet API would make this really easy) that listens for requests from Server A. The Servlet running on Server A would:
1. Do whatever it needs to do
2. Open an HttpURLConnection to Server B, use the getOutputStream() method to get a pipe to write serialized data to, couple it with an ObjectOutputStream, and write the session object to it.
3. Use the sendRedirect() method to redirect the client to Server B.
Upon receiving a request, the Servlet on Server B would:
1. Call Servlet.getInputStream() to get the input stream to read objects from.
2. Couple this with an ObjectInputStream to read objects from.
3. Read the session object and cast it to the appropriate type.
4. Stash the session object in a global lookup so it can be retrieved when the client arrives. I don't think the session can be created at this point because the request doesn't originate from the browser.
Then, finally, the Servlet running on Server B that handles client requests would:
1. Create a new session
2. Retrieve the session object from the global data store and stash it in session.
3. Go on its merry way.
Hope this was on target and is useful. -
Getting ClassCastException when accessing Blob object
I am using weblogic 5.1 with service pack 10.
I need to query pdf data stored in a blob field in Oracle
8.1.6 server. The native code c:\weblogic\bin\oci816_8
is part of the path. When I query the database with
Oracle 8 client, I can get data.
driver: weblogic.jdbc20.oci.Driver
url: jdbc20:weblogic:oracle:mydb
What I have done is to get the blob object with:
Blob blob = rs.getBlob(5);
long len = blob.length();
But when I call the blob.length();
I got the a ClassCastException. I really appreicate
your comment.
The exception message is:
====================================================
java.lang.ClassCastException: java.lang.String
at weblogic.jdbc20.oci.Blob.length(Blob.java:75)
at com.agf.profile.ProfileServlet.doProcess(ProfileServlet.java:126)
at com.agf.profile.ProfileServlet.doGet(ProfileServlet.java:37)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:865)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletSt
pl.java:120)
at weblogic.servlet.internal.ServletContextImpl.invokeServlet(Servle
textImpl.java:922)
at weblogic.servlet.internal.ServletContextImpl.invokeServlet(Servle
textImpl.java:886)
at weblogic.servlet.internal.ServletContextManager.invokeServlet(Ser
ContextManager.java:269)
at weblogic.socket.MuxableSocketHTTP.invokeServlet(MuxableSocketHTTP
a:380)
at weblogic.socket.MuxableSocketHTTP.execute(MuxableSocketHTTP.java:
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:129)
====================================================
Thanks,
Jianhi jian,
it seems you are trying to access a column as a blob type when the data in
that column is not blob.
Make sure that your column number 5 is defined as Blob in the database.
I tried the following code and it worked fine for me.
Blob b=rs.getBlob("data");
long l=b.length();
byte bt[]=b.getBytes(1,(int)b.length());
File f=new
File("d:\\bea\\wlserver6.1\\config\\jdbcdomain\\applications\\defaultwebapp\
\blob_new.pdf");
FileOutputStream fos=new FileOutputStream(f);
fos.write(bt);
fos.close();
It was able to create the file blob_new.pdf
But when I tried the following code it gave me the same exception as you are
getting
Blob bb=rs.getBlob("id");
long ll=bb.length();
Where id is a column in the database of varchar type
I am using the following settings
driver: weblogic.jdbc.oci.Driver
url: jdbc:weblogic:oracle
i am using wl 6.1 and oracle 8
Hope this helps you.
johnny
"jian zhang" <[email protected]> wrote in message
news:[email protected]...
>
I am using weblogic 5.1 with service pack 10.
I need to query pdf data stored in a blob field in Oracle
8.1.6 server. The native code c:\weblogic\bin\oci816_8
is part of the path. When I query the database with
Oracle 8 client, I can get data.
driver: weblogic.jdbc20.oci.Driver
url: jdbc20:weblogic:oracle:mydb
What I have done is to get the blob object with:
Blob blob = rs.getBlob(5);
long len = blob.length();
But when I call the blob.length();
I got the a ClassCastException. I really appreicate
your comment.
The exception message is:
====================================================
java.lang.ClassCastException: java.lang.String
at weblogic.jdbc20.oci.Blob.length(Blob.java:75)
atcom.agf.profile.ProfileServlet.doProcess(ProfileServlet.java:126)
at com.agf.profile.ProfileServlet.doGet(ProfileServlet.java:37)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:865)
atweblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletSt
pl.java:120)
atweblogic.servlet.internal.ServletContextImpl.invokeServlet(Servle
textImpl.java:922)
atweblogic.servlet.internal.ServletContextImpl.invokeServlet(Servle
textImpl.java:886)
atweblogic.servlet.internal.ServletContextManager.invokeServlet(Ser
ContextManager.java:269)
atweblogic.socket.MuxableSocketHTTP.invokeServlet(MuxableSocketHTTP
a:380)
atweblogic.socket.MuxableSocketHTTP.execute(MuxableSocketHTTP.java:
>
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:129)
====================================================
Thanks,
Jian -
EOFException when receiving an object .
I've got the following problem:
I've a client connected to a server via TCP/IP-Socket. They communicate by exchanging objects using ObjectStream. This works properly in principle, but ... sometimes the server throws an java.io.EOFException while reading a serialized object?
Note: All objects being transfered between server and client implement the Serializable-Interface, do have a serialVersionUID and are the same for both server and client.
Is there anybody out who has an idea what reason it may be, that this kind of exception occures when a serialized object is read by an ObjectInputStream??Could be because sometimes you are sending an incomplete object. For example by using the size of a created arrray rather than the the number of bytes in the array.
Or due to a failure in the network traffic.
Without code, debugging information, and a repeatable test case it is hard to say though. -
Applet/Servlet/serialized objects/HTTPS/Intranet problem
We've got a Webapplication with[b] applets on the client and servlets on the server side.The Applet send serialized Objects over HTTPS (SSL) to the servlet. The servlet does some business logic and send the answer the same way back.
In all our tests and in the most cases the application works without any problems.
But in some Intranet environments we get occasionally (not definitely reproducable) the following error:
<Oct 1, 2004 8:26:00 AM> [AnmeldenService] {Service-readThreadAks-AnmeldenServiceThread}
java.io.EOFException: Expecting code
at java.io.ObjectInputStream.peekCode(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at com.dsh.egb.aks.betrieb.rclt.service.ServiceThread$2.run(ServiceThread.java:222)
at java.lang.Thread.run(Unknown Source)Has anybody an idea how to further analyse this problem?
Thanks,
Mark
We use JRE/JDK 1.3.1_10.Here some more Information about our environment:
Server: Apache 1.3.26 / Openssl 0.9.6d /WinNT 4.0 /HTTP Redirect to Tomcat 4.0.1/ JDK1.3.1_10/ WinNT 4.0
Client: Plugin 1.3.1_10/Internet Explorer 6.0 (SSL)/Win NT 4.0 -
Revision: 949
Author: [email protected]
Date: 2008-03-27 07:12:59 -0700 (Thu, 27 Mar 2008)
Log Message:
Bug: BLZ-96 - When sending a HttpService request from ActionScript with multiple headers with the same name, it causes a ClassCastException in the server
QA: Yes - try again with legacy-collection true and false.
Doc: No
Checkintests: Pass
Details: Another try in fixing this bug. When legacy-collection is false, Actionscript Array on the client becomes Java Array on the server and my fix yesterday assumed this case. However, when legacy-collection is true, Actionscript Array becomes Java ArrayList on the server. So added code to handle this case.
Ticket Links:
http://bugs.adobe.com/jira/browse/BLZ-96
Modified Paths:
blazeds/branches/3.0.x/modules/proxy/src/java/flex/messaging/services/http/proxy/RequestF ilter.javaHi all!
Just to post the solution to this if anyone ever runs accross this thread...
For some reason i had it bad the first time, don't have time right now to see why but here is what worked for me:
HashMap primaryFile = new HashMap();
primaryFile.put("fileContent", bFile);
primaryFile.put("fileName", uploadedFile.getFilename());
operationBinding.getParamsMap().put("primaryFile", primaryFile);
HashMap customDocMetadata = new HashMap();
HashMap [] properties = new HashMap[1];
HashMap customMetadataPropertyRoom = new HashMap();
customMetadataPropertyRoom.put("name", "xRoom");
customMetadataPropertyRoom.put("value", "SOME ROOM");
properties[0] = customMetadataPropertyRoom;
customDocMetadata.put("property", properties);
operationBinding.getParamsMap().put("CustomDocMetaData", customDocMetadata);
Basically an unbounded wsdl type is an array of objects (HashMaps), makes sense, i thought i had it like this before, must have messed up somewhere...
Good luck all! -
Revision: 931
Author: [email protected]
Date: 2008-03-26 11:31:01 -0700 (Wed, 26 Mar 2008)
Log Message:
Bug: BLZ-96 - When sending a HttpService request from ActionScript with multiple headers with the same name, it causes a ClassCastException in the server
QA: Yes - we need automated tests for this basic case.
Doc: No
Checkintests: Pass
Details: RequestFilter was not handling multiple headers with the same name properly.
Ticket Links:
http://bugs.adobe.com/jira/browse/BLZ-96
Modified Paths:
blazeds/branches/3.0.x/modules/proxy/src/java/flex/messaging/services/http/proxy/RequestF ilter.javaHi all!
Just to post the solution to this if anyone ever runs accross this thread...
For some reason i had it bad the first time, don't have time right now to see why but here is what worked for me:
HashMap primaryFile = new HashMap();
primaryFile.put("fileContent", bFile);
primaryFile.put("fileName", uploadedFile.getFilename());
operationBinding.getParamsMap().put("primaryFile", primaryFile);
HashMap customDocMetadata = new HashMap();
HashMap [] properties = new HashMap[1];
HashMap customMetadataPropertyRoom = new HashMap();
customMetadataPropertyRoom.put("name", "xRoom");
customMetadataPropertyRoom.put("value", "SOME ROOM");
properties[0] = customMetadataPropertyRoom;
customDocMetadata.put("property", properties);
operationBinding.getParamsMap().put("CustomDocMetaData", customDocMetadata);
Basically an unbounded wsdl type is an array of objects (HashMaps), makes sense, i thought i had it like this before, must have messed up somewhere...
Good luck all! -
I have an applet which calls a JSP to write data object to the db and then the
JSP sends back the updated data object. The writing part is ok but the response
is giving the following error. The data object is in a separate class which implements
Serialized.
Here's the code in the applet calling the JSP and the response from the JSP
URL server = null;
String urlConnectionString = "http://localhost:7001/isLoginValid.jsp";
try
server = new URL(urlConnectionString);
catch(MalformedURLException e)
System.out.println("URL exception: " + e );
// send request
ObjectInputStream response = null;
Object result = null;
try
URLConnection conn = server.openConnection();
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestProperty("Content-Type", "application/octet-stream");
ObjectOutputStream request = new ObjectOutputStream(new
BufferedOutputStream(conn.getOutputStream()));
request.writeObject((Object)dvo);
request.flush();
request.close();
// get the result input stream
response = new ObjectInputStream(new BufferedInputStream
(conn.getInputStream()));
// read response back from the server
result = response.readObject();
if( result!=null && (result instanceof DataVO))
dvo = (DataVO)result;
String vo = dvo.printDataVO();
System.out.println("*DataVO*\n"+vo);
else
System.out.println("not an instanceof DataVO");
catch(IOException ignored)
System.out.println("Error in DataVO response");
ignored.printStackTrace();
Here's the code in the JSP sending the response back to the applet. The 'dvo'
object is the object which is serialized and has gets and sets for the diff. data
elements. When I print the 'dvo' before writing the object to outputStream it
prints the correct values for the data element.
// send response
response.setStatus(HttpServletResponse.SC_OK);
ObjectOutputStream outputStream = new ObjectOutputStream (new BufferedOutputStream
(response.getOutputStream()));
outputStream.writeObject(dvo);
outputStream.flush();
ERROR is as follows:
Error in DataVO response
java.io.StreamCorruptedException: InputStream does not contain a serialized object
at java/io/ObjectInputStream.readStreamHeader
at java/io/ObjectInputStream.<init>
What am I doing wrong?. Please respond soon. The applet is run on IIS and the
JSP in on weblogic 6.1. I'm not sure if that makes any difference.
I have an applet which calls a JSP to write data object to the db and then the
JSP sends back the updated data object. The writing part is ok but the response
is giving the following error. The data object is in a separate class which implements
Serialized.
Here's the code in the applet calling the JSP and the response from the JSP
URL server = null;
String urlConnectionString = "http://localhost:7001/isLoginValid.jsp";
try
server = new URL(urlConnectionString);
catch(MalformedURLException e)
System.out.println("URL exception: " + e );
// send request
ObjectInputStream response = null;
Object result = null;
try
URLConnection conn = server.openConnection();
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestProperty("Content-Type", "application/octet-stream");
ObjectOutputStream request = new ObjectOutputStream(new
BufferedOutputStream(conn.getOutputStream()));
request.writeObject((Object)dvo);
request.flush();
request.close();
// get the result input stream
response = new ObjectInputStream(new BufferedInputStream
(conn.getInputStream()));
// read response back from the server
result = response.readObject();
if( result!=null && (result instanceof DataVO))
dvo = (DataVO)result;
String vo = dvo.printDataVO();
System.out.println("*DataVO*\n"+vo);
else
System.out.println("not an instanceof DataVO");
catch(IOException ignored)
System.out.println("Error in DataVO response");
ignored.printStackTrace();
Here's the code in the JSP sending the response back to the applet. The 'dvo'
object is the object which is serialized and has gets and sets for the diff. data
elements. When I print the 'dvo' before writing the object to outputStream it
prints the correct values for the data element.
// send response
response.setStatus(HttpServletResponse.SC_OK);
ObjectOutputStream outputStream = new ObjectOutputStream (new BufferedOutputStream
(response.getOutputStream()));
outputStream.writeObject(dvo);
outputStream.flush();
ERROR is as follows:
Error in DataVO response
java.io.StreamCorruptedException: InputStream does not contain a serialized object
at java/io/ObjectInputStream.readStreamHeader
at java/io/ObjectInputStream.<init>
What am I doing wrong?. Please respond soon. The applet is run on IIS and the
JSP in on weblogic 6.1. I'm not sure if that makes any difference.
-
ClassCastException when calling SOAP adapter
Hello,
I created a Web service interface to an ABAP RFC
via XI and a corresponding communication channel
(SOAP/HTTP to a specific message interface with data
types, message types, mappings etc. defined in the
integration repository). Sending SOAP messages
and receiving the correct replies works fine.
However, when I transport the relevant objects
from our test system to the consolidation system
by exporting and then importing via the file system
(all objects of the software component in the integration
repository, all objects of the communication scenario
in the integration directory), the
ClassCastException given below is returned
when sending the same SOAP messages
to the consolidation system. Other SOAP interfaces
work, but the one I imported does not.
Unfortunately, the request neither shows up in
the XmlMonitor nor in MessageMonitoring in the
Runtime workbench, so I do not get a further
indication what actually went wrong.
Questions:
- Has anyone had a similar problem or the same
error message? If so, what was the cause?
- Does anyone (maybe from SAP) know what exactly
happens in the mentioned code line where the
exception is thrown?
- Where could I look to find further information
about the error?
System information:
- SAP BASE 6.40, XI 3.0 with Service Pack 15
Thanks + Cheers,
Guido
<?xml version='1.0'?>
<!-- see the documentation -->
<SOAP:Envelope xmlns:SOAP='http://schemas.xmlsoap.org/soap/envelope/'>
<SOAP:Body>
<SOAP:Fault>
<faultcode>SOAP:Server</faultcode>
<faultstring>Server Error</faultstring>
<detail>
<s:SystemError xmlns:s='http://sap.com/xi/WebService/xi2.0'>
<context>XIAdapter</context>
<code>ClassCastException</code>
<text><![CDATA[
java.lang.ClassCastException
at com.sap.aii.af.mp.ejb.ModuleProcessorBean.process(ModuleProcessorBean.java:227)
at com.sap.aii.af.mp.processor.ModuleProcessorLocalLocalObjectImpl0.process(ModuleProcessorLocalLocalObjectImpl0.java:103)
at com.sap.aii.af.mp.soap.web.MessageServlet.callModuleProcessor(MessageServlet.java:159)
at com.sap.aii.af.mp.soap.web.MessageServlet.doPost(MessageServlet.java:383)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at com.sap.engine.services.servlets_jsp.server.HttpHandlerImpl.runServlet(HttpHandlerImpl.java:390)
at com.sap.engine.services.servlets_jsp.server.HttpHandlerImpl.handleRequest(HttpHandlerImpl.java:264)
at com.sap.engine.services.httpserver.server.RequestAnalizer.startServlet(RequestAnalizer.java:347)
at com.sap.engine.services.httpserver.server.RequestAnalizer.startServlet(RequestAnalizer.java:325)
at com.sap.engine.services.httpserver.server.RequestAnalizer.invokeWebContainer(RequestAnalizer.java:887)
at com.sap.engine.services.httpserver.server.RequestAnalizer.handle(RequestAnalizer.java:241)
at com.sap.engine.services.httpserver.server.Client.handle(Client.java:92)
at com.sap.engine.services.httpserver.server.Processor.request(Processor.java:148)
at com.sap.engine.core.service630.context.cluster.session.ApplicationSessionMessageListener.process(ApplicationSessionMessageListener.java:33)
at com.sap.engine.core.cluster.impl6.session.MessageRunner.run(MessageRunner.java:41)
at com.sap.engine.core.thread.impl3.ActionObject.run(ActionObject.java:37)
at java.security.AccessController.doPrivileged(Native Method)
at com.sap.engine.core.thread.impl3.SingleThread.execute(SingleThread.java:95)
at com.sap.engine.core.thread.impl3.SingleThread.run(SingleThread.java:160)
]]></text>
</s:SystemError>
</detail>
</SOAP:Fault>
</SOAP:Body>
</SOAP:Envelope>Hi,
looking to the stack trace provided by i found this
>>at java.security.AccessController.doPrivileged(Native >>Method)
this means that you have defined assigned users for the business service in configuration directory.
Make sure the client is making the webservice call using that specific user.
cheers,
naveen -
Hi!
I'm trying to create some server software that will allow any number of applets to connect to the server and communicate with each other. Presumably, only applets of the same type would talk together, though applets could send general string messages. I've created a general serialized object, Packet, which all applets would send to the server, and which the server would then pass on to the destination applet(s).
The problem is that Packet has a field "data" of type Object. When data is something the server knows about, such as a String or a Vector, it does ok. But if the code for the applets creates a new class, say AppletPacket (which is serializable), and sets somePacket.data to an object of type AppletPacket, the server throws errors when it is reading the somePacket from its objectinputstream, saying it can't typecast something of type AppletPacket. But I'm not typecasting anywhere! The server doesn't have to know anything about what data represents, it just needs to send it on, and presumably the destination applets will know what to do with it.
Can anyone suggest a work around, or tell me what I have to do so that applets can send a general Object that may represent a class the server doesn't know about and not have the server throw an error?
Thanx
Jim D.Just to clairify: The server doesn't have to do anything with the content of "data" apart from holding on to it, and pass it to another applet?
If that's the case substitute the Object in the "data" field for an array of bytes obtained by having the applet run the "Object" through ObjectOutputStream.
What's happening is that the server is deserializing the Packet when it arrives in the JVM of the server, when it comes across the "data" field it looks to see what class the instance really is, and fails as you dscribe if it doesn't have the class definition. -
Hello everybody,
When I serialize a object to a Byte Array the size of the Byte Array is not exactly the size of the object because of some meta data information. Is there any way there I can predict excatly the size that the Object will have when I serialize it? Of course I known the attributes size of this Object.
For example if I have an Object X with two attributes Integer A and B with 4 bytes each, I'd like to predict that the Byte Array of this serialized Object wil have 10 bytes (8 for the two attributes and 2 for meta data). Does anybody have an idea?
Thanks,
BrunoIs
there any way there I can predict excatly the size
that the Object will have when I serialize it?Yes. You can serialize it to a byte array, then take the size of that. Then you can send the byte array instead of serializing the original object.
Basically this is something that's very unlikely to be useful. What are you trying to achieve and why do you think you need to know this information?
Dave. -
Serializing objects with the NIO API
I try to use the new IO API to implement a non-blocking multi-threaded server that communicates with client applications by exchanging serialized objects. I started from the code in the JavaWorld article at http://www.javaworld.com/javaworld/jw-09-2001/jw-0907-merlin.html .
With the new features of J2SDK 1.4.0, you don't have to create a separate thread per connected client. That is a big improvement.
But when I read an object with ObjectInputStream, I get a java.nio.channels.IllegalBlockingModeException.
Has anybody successfully implemented such a server since the release of the new io API?
Thanks.
Jean-RobertThe ObjectStream code is basically incompatible with non blockin I/O since you must block on the stream until a whole Object is available. You could roll something like this yourself, by reading bytes until there are enough available to build the next object and then getting that Object from the buffer and shipping it to your client thread. All of this is far more trouble than just using the Stream oriented I/O.
NIO and mutilple threads are a nightmare, the whole idea of non-blocking I/O is to avoid needing multiple threads. If you do use multiple threads you will need queues between them. See the Taming the NIO Circus topic for lots of discussion of NIO and its problems. The system seems more stable in JDK 1.5, but most people haven't even started using 1.4 for production yet.
Personally I avoid ObjectStreams. They are only useful between Java applications, if I want that I just use RMI and let Java do ALL the hard work. When I write a Socket based app, its probably because the other end is a mainframe of a C program. For that reason I send data as bytes, packaged up in packets, and encode as XML or ASN.1 so the other end can interpret it. -
RMI - Serializing Object with the right constructor..?
Hello, I am trying to usr RMI to send an object that I serialized but I have further porblems than that. The Object that I am using is called FileLineReader and it Extends Buffered Reader. SInce Buffered Reader is not Serializable, I implemented Serializable within FileLineReader, so that I can send it through the RMI.
package musr.client.dbreader;
import java.io.*;
public class FileLineReader extends BufferedReader
implements LineReader, java.io.Serializable {
String pattern; // The string we are going to be matching.
* Constructor
* Passes the stream to our superclass
public FileLineReader(Reader in) { super(in); }
* This is the filter: call our superclass's readLine() to get the
* actual lines, but only return lines that contain the pattern.
* When the superclass readLine() returns null (EOF), we return null.
public String matchLine(String pattern) throws IOException {
String line;
do { line = super.readLine(); }
while ((line != null) && line.indexOf(pattern) == -1);
return line;
When I use this object to send it through RMI to the Server,
(FileLineReader)inFile = (FileLineReader) obj.senddbFile(openFileTextField1.getText(),openFileTextField2.getText());
I get an exception:
GUI_RMI exception, error unmarshalling return; nested exception is: java.io.InvalidClassException: musr.client.dbreader.FileLineReader; no valid constructor.
I am not sure what the problem is and I have been struggling with it for a while now. The constructor of BufferedReader takes one argument in so I have to pass FileLineReader an argument when I construct it. I think the RMI needs a constructor that takes no arguments and that causes problems. Is that true? In that case, I can't extend my class with BufferedReader.
Or maybe the problem is somthing quite different. Anyone has any suggestions or comments, I'd appreciate help. Thanks IvanYou will have to create your own stream. (RMI is just a way to call reemote methods; it knows nothing about files or I/O.)
1. You need a RemoteReader. This object should probably have 3 or so methods:
Open(filename) Opens the file
read reads a block from the file and returns it as a byte array.
close()
2. You need a RemoteInputStream object.
o Instantiated on the client.
o Makes calls to the RemoteReader.
o Has some read methods and a close method.
o Implements InputStream.
With these two objects, you have enough underpinnings top - for example - wrap the RemoteINputStream in a BufferedReader or whatever you need.
Maybe you are looking for
-
Anyone have any idea why I can't get my popupmenu to work? I have two sets of data, one we'll call code groups and the other group items. I simply want the group items to be a submenu of their group. I can get exactly one group item to slide out,
-
QT 10,0 In Snow...where have copy and paste gone?
QT Pro was AWESOME and assumed that the new QT 10.0 was better and now cannot event copy a clip from one QT file to paste to another. What is even more annoying is QT 10.0 help When you put the word "copy" in the QT 10.0 help window you get NOTHING..
-
Settings changing when adding to another movie
Each time I attach a new chapter (mini movie) PROJECT to the already existing main movie PROJECT the settings change. I have tried adding on the front with the new chapter as well as trying to add the main movie to the mini movie. Is there a way to l
-
How can i use the parallel port
I was wondering how to adress my PC´s parallel port. I did'nt find a suitable VI in the palettes. Do I have to read/write somehow directly to the port adress in memory 0378 ...? If so, how can this be done ? Thanks for any help, Holsch
-
Grayed out music on itunes for mini
The shuffle is working fine. The mini however is recognized but all of the music is grayed out. Not the normal black fonts How do I access the music so I can change what is on it? This is my kids so he could have done anything Thanks John