You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@tuscany.apache.org by "Malisetti, Ramanjaneyulu" <Ra...@ca.com> on 2010/10/04 06:17:56 UTC
RE: Throwable as method argument causes exception
Hi Sebastian,
Is this solution finally working? I am
curious to know what is the working solution. Because, I too have
similar situation, but currently I am passing as a String and recreating
exception on client side. I know this is hack.
Regards
Raman
From: Raymond Feng [mailto:enjoyjava@gmail.com]
Sent: Thursday, September 16, 2010 5:03 AM
To: user@tuscany.apache.org
Subject: Re: Throwable as method argument causes exception
You will have to add the setters for the properties so that JAXB can
unmarshal the data into the bean (wrapper).
________________________________________________________________
Raymond Feng
rfeng@apache.org
Apache Tuscany PMC member and committer: tuscany.apache.org
Co-author of Tuscany SCA In Action book: www.tuscanyinaction.com
Personal Web Site: www.enjoyjava.com
________________________________________________________________
On Sep 15, 2010, at 4:07 PM, Millies, Sebastian wrote:
Hello Mike,
strangely, when I pass my wrapper class over JMS to the service, both
its
attributes will be set to null by some mediating code in Tuscany.
Is there an example somewhere from which I can see what I am doing
wrong?
-- Sebastian
PS: For what its worth, here is the code of my Throwable wrapper:
public class ThrowableWrapper implements Serializable
{
private static final long serialVersionUID = 7112569161595756136L;
private byte[] b;
private String stacktrace;
public ThrowableWrapper()
{
}
public ThrowableWrapper( Throwable t ) throws IOException
{
// write the Throwable to a byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(t);
b = baos.toByteArray();
// save stack trace as string, because it won't be serialized
StringWriter w = new StringWriter();
PrintWriter p = new PrintWriter( w );
t.printStackTrace( p );
stacktrace = w.getBuffer().toString();
}
public Throwable getThrowable() throws IOException,
ClassNotFoundException {
ByteArrayInputStream bais = new ByteArrayInputStream(b);
ObjectInputStream ois = new ObjectInputStream(bais);
Object t = ois.readObject();
return (Throwable) t;
}
public String getStackTraceString() {
return stacktrace;
}
}
-----Original Message-----
From: Millies, Sebastian
[mailto:Sebastian.Millies@ids-scheer.com]
Sent: Wednesday, September 15, 2010 4:58 PM
To: user@tuscany.apache.org
Subject: Re: Throwable as method argument causes exception
Hello Mike,
thanks for the hint. In fact I have already tried using a
wrapper
class,
which did NOT serialize the Throwable, but simply stored it in
an
attribute
for which it also provided a getter-method. Imagine my surprise
when
the exception
went away. I am still puzzled about what is going on. It almost
seems
as if
JAXB did not traverse the entire object graph, but stopped after
one
level.
Anyway, I guess I really should serialize the Throwable, but for
my
purposes
I will want to serialize the stack trace, too, because I am
implementing a logging
service, which should as a matter of course log the stack trace
of the
exception
that is passed in by the client. I hope serializing to a byte
array is
acceptable
to JAXB.
-- Sebastian
-----Original Message-----
From: Mike Edwards
[mailto:mike.edwards.inglenook@gmail.com]
Sent: Wednesday, September 15, 2010 4:44 PM
To: user@tuscany.apache.org
Subject: Re: Throwable as method argument causes
exception
Millies, Sebastian wrote:
but that should not be a problem here. I am not
throwing an
exception,
I am simply passing one as a method parameter.
-- Sebastian
Sebastian,
Ah yes, I ran into this entertaining problem when I
coded the Async
invocation code in 2.x.
Fundamentally, the problem is caused because Throwable
is not
serializable - as others have noted,
it has a getStackTrace() method which causes the
problem.
When I wanted to pass an exception as a parameter, what
I did was to
create a wrapper class and put
the exception into the wrapper class, with the wrapper
class taking
care of the serialization of the
exception. This did mean that I did NOT serialize the
stack trace -
but in an SOA world, I think
that handing over stack traces between clients and
services is not a
good plan anyway, so I think
that this is OK.
You may wish to approach the problem along similar
lines.
Yours, Mike.