I'm a little bit confused, because you mixed System.out and log.
Could it be that the first element of the List returns null, it fails
with a NPE in author.isPerson() and we don't see the System.out logs?
M.
Mark Slater schrieb:
I'm getting some very strange behavior here. Extracting the Authors
from the list is silently failing without throwing any exceptions. It
seems to be just skipping code.
Here's the method I have that sets the Authors of the
LibraryItemInfoData object:
public final void setAuthors( final List<Author> allAuthors )
{
getLogger().info( "Set Authors as list: " + allAuthors + ",
num authors = " +
allAuthors.size() );
try
{
Class allAuthorsClass = allAuthors.getClass();
getLogger().info( "allAuthors class = " + allAuthorsClass );
getLogger().info( "allAuthors interfaces = " +
allAuthorsClass.getInterfaces() );
}
catch( Exception e )
{
System.out.println( "got exception trying to examine
allAuthors class." );
}
if( allAuthors.size() >= 1 )
{
getLogger().info( "clearing authors." );
authors.clear();
int numNewAuthors = allAuthors.size();
getLogger().info( "allAuthors size, numNewAuthors = " +
numNewAuthors );
for( int i = 0; i < numNewAuthors; i++ )
{
try
{
getLogger().info( "Getting author: " + i );
Author author = allAuthors.get( i );
getLogger().info( "Got author" );
System.out.println( "author is person = " +
author.isPerson() );
getLogger().info( "Making author data" );
try
{
AuthorData newAuthor = new AuthorData( author );
System.out.println( "new author = " +
newAuthor );
authors.add( newAuthor );
}
catch( Exception e )
{
System.out.println(
"got exception trying to make new
AuthorData object: " + e );
}
}
catch( Exception e )
{
System.out.println(
"got exception trying to get author " + i + ":
" + e );
}
}
getLogger().info( "authors list is now: " + authors );
}
}
As I said before, Author is an interface. I don't mind XFire sending
back a dynamic proxy because, I would think anyway, I can call the
standard getters on that to create a new implementation class
(AuthorData) instance based on the proxy. That's not working. Here's
the log output I'm getting:
2006-04-19 13:31:16,910 INFO
[edu.ucsc.whisper.core.LibraryItemInfoData] - <Set Authors as list:
[EMAIL PROTECTED], num authors = 1>
2006-04-19 13:31:16,911 INFO
[edu.ucsc.whisper.core.LibraryItemInfoData] - <allAuthors class =
class java.util.ArrayList>
2006-04-19 13:31:16,911 INFO
[edu.ucsc.whisper.core.LibraryItemInfoData] - <allAuthors interfaces =
[Ljava.lang.Class;@3d54d4>
2006-04-19 13:31:16,911 INFO
[edu.ucsc.whisper.core.LibraryItemInfoData] - <clearing authors.>
2006-04-19 13:31:16,911 INFO
[edu.ucsc.whisper.core.LibraryItemInfoData] - <allAuthors size,
numNewAuthors = 1>
2006-04-19 13:31:16,911 INFO
[edu.ucsc.whisper.core.LibraryItemInfoData] - <Getting author: 0>
2006-04-19 13:31:16,911 INFO
[edu.ucsc.whisper.core.LibraryItemInfoData] - <Got author>
2006-04-19 13:31:16,911 INFO
[edu.ucsc.whisper.core.LibraryItemInfoData] - <authors list is now: []>
You can see that as soon as I try to access a field of the proxy
Author instance, the entire loop just skips to the end where it prints
that the authors list is now []. No exception is logged. In addition,
trying to use an Iterator on the newAuthors list failed to return any
of the objects in the list, as did the Java 5 for( Author author :
allAuthors ) loop. I would expect this line would be executed at least:
getLogger().info( "Making author data" );
I'm using xfire-all-1.1-beta-1.jar, and cglib 2.1_3 is in my project
as well (I'm assuming that's how the dynamic proxies are being created).
Is this a known issue? Or am I still doing something wrong?
Mark
On Apr 19, 2006, at 11:20 AM, Dan Diephouse wrote:
Mark Slater wrote:
As far as the Author type goes, it is an interface. The
implementation class is AuthorData. Could that be causing this
problem? Is there a way to tell XFire to create AuthorData instances
whenever it gets an Author inside a SOAP body, rather than changing
the method signatures? I actually tried to change the method
signatures, saw the WSDL update, but didn't get any change in
behavior; the authors were still not set.
Currently there isn't a way to do this. There is a JIRA for it however:
http://jira.codehaus.org/browse/XFIRE-321
Right now XFire can only create a dynamic proxy which implements the
interface and it will use the interface to generate the WSDL.
- Dan
--Dan Diephouse
Envoi Solutions
http://envoisolutions.com
http://netzooid.com/blog
--
cyber:con gmbh
Mika Göckel
Rathausallee 10
53757 Sankt Augustin
tel (+49)2241 / 9350 0
fax (+49)2241 / 9350 99
mob (+49) 172 / 279 2771
skype mika.goeckel
email [EMAIL PROTECTED]