[jboss-user] [JBossWS] - Re: Problems returning arrays from Webservice Method
kaza
do-not-reply at jboss.com
Mon Nov 6 03:27:04 EST 2006
I have changed the code in SOAPContentElement that deals with the array part. The original code says
if (obj != null)
{
Class objType = obj.getClass();
boolean isAssignable = JavaUtils.isAssignableFrom(javaType, objType);
if (isAssignable == false && javaType.isArray())
{
try
{
Method toArrayMethod = objType.getMethod("toArray", new Class[] {});
Class returnType = toArrayMethod.getReturnType();
if (JavaUtils.isAssignableFrom(javaType, returnType))
{
Method getValueMethod = objType.getMethod("getValue", new Class[] {});
Object value = getValueMethod.invoke(obj, new Object[] {});
if (value != null)
{
// Do not invoke toArray if getValue returns null
obj = toArrayMethod.invoke(obj, new Object[] {});
}
else
{
// if the fragment did not indicate a null return
// by an xsi:nil we return an empty array
Class componentType = javaType.getComponentType();
obj = Array.newInstance(componentType, 0);
}
isAssignable = true;
}
}
catch (Exception e)
{
// ignore
}
}
I think it is better to look to the object that was deserialized to decide wether this is an array. If it turns out to be an array then look for a setter method that takes this array class as argument. If that exists set its value. I think this way of unmarshalling fits better to the way the client artifacts are generated by wstools. This is my version of the code
if (obj != null) {
Class objType = obj.getClass();
boolean isAssignable = JavaUtils.isAssignableFrom(javaType, objType);
if (isAssignable == false && objType.isArray()) { // Changed
try {
log.debug("Try to locate setValue method "+javaType);
Method setValueMethod = javaType.getMethod("setValue", new Class[] {objType});
log.debug("Try to create new instance for "+javaType);
Object newInstance = javaType.newInstance();
log.debug("Try to invoke setValueMethod ");
setValueMethod.invoke(newInstance, new Object[] {obj});
isAssignable = true;
obj = newInstance;
} catch (Exception e) {
e.printStackTrace();
}
}
Erik
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3983373#3983373
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3983373
More information about the jboss-user
mailing list