Doh!
Convert everything to jaxb instead of Aegis and it all works fine.
Because, of course, that class generated by wsdl2java is jaxb, not aegis.
Jim
On 16/07/2010 09:32, Jim Talbut wrote:
Hi,
I have this class generated by wsdl2java (comments remove):
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "RunExtensionArgumentsType", propOrder = {
"extensionArgument"
})
public class RunExtensionArgumentsType
implements Serializable
{
@XmlElement(name = "ExtensionArgument")
protected List<RunExtensionType> extensionArgument;
public List<RunExtensionType> getExtensionArgument() {
if (extensionArgument == null) {
extensionArgument = new ArrayList<RunExtensionType>();
}
return this.extensionArgument;
}
}
I have been serialising it for ages using the following code:
static {
aegisContext.initialize();
TypeMapping tm = aegisContext.getTypeMapping();
Type aegisType = tm.getType( RunExtensionArgumentsType.class );
if( aegisType == null )
{
// Make a new type and register it for the future.
log.debug( "Registering type for
RunExtensionArgumentsType" );
TypeCreator tc = tm.getTypeCreator();
aegisType = tc.createType( RunExtensionArgumentsType.class );
QName qName = new QName( "http://groupgti.com/s-service",
"RunExtensionType");
tm.register( RunExtensionArgumentsType.class, qName,
aegisType );
}
}
public static String extensionArgsToString(
RunExtensionArgumentsType extensionArgs )
{
try
{
StringWriter stringWriter = new StringWriter();
XMLStreamWriter xmlWriter =
xmlOutputFactory.createXMLStreamWriter( stringWriter );
AegisWriter<XMLStreamWriter> writer =
aegisContext.createXMLStreamWriter();
TypeMapping tm = aegisContext.getTypeMapping();
Type aegisType = tm.getType(
RunExtensionArgumentsType.class );
writer.write( extensionArgs, aegisType.getSchemaType(),
true, xmlWriter, aegisType );
xmlWriter.close();
return stringWriter.toString();
}
catch( Exception ex )
{
log.error( ExceptionStringConverter.ExceptionWithCauses(
ex ) );
return null;
}
}
Now I come to deserialize it using this:
public static RunExtensionArgumentsType extensionArgsFromString(
String extensionArgsString )
{
try
{
StringReader stringReader = new StringReader(
extensionArgsString );
XMLStreamReader xmlReader =
xmlInputFactory.createXMLStreamReader( stringReader );
AegisReader<XMLStreamReader> reader =
aegisContext.createXMLStreamReader();
TypeMapping tm = aegisContext.getTypeMapping();
Type aegisType = tm.getType(
RunExtensionArgumentsType.class );
Object result = reader.read( xmlReader, aegisType );
xmlReader.close();
return (RunExtensionArgumentsType)result;
}
catch( Exception ex )
{
StringBuilder msg = new StringBuilder();
msg.append( "Exception whilst trying to convert \"
").append( extensionArgsString ).append( "\" to
RunExtensionArgumentsType:\n\t" );
log.error( ExceptionStringConverter.ExceptionWithCauses(
msg, ex ) );
return null;
}
}
but it hits this exception:
org.apache.cxf.aegis.DatabindingException:
No write method for property
{http://groupgti.com/s-service}extensionArgument in class
com.groupgti.s_service.RunExtensionArgumentsType:
No write method for property
{http://groupgti.com/s-service}extensionArgument in class
com.groupgti.s_service.RunExtensionArgumentsType:
org.apache.cxf.aegis.type.basic.BeanType:writeProperty @
BeanType.java:272
org.apache.cxf.aegis.type.basic.BeanType:readObject @ BeanType.java:163
org.apache.cxf.aegis.AegisXMLStreamDataReader:read @
AegisXMLStreamDataReader.java:82
org.apache.cxf.aegis.AegisXMLStreamDataReader:read @
AegisXMLStreamDataReader.java:31
com.groupgti.services.service.XmlConversionSupport:extensionArgsFromString
@ XmlConversionSupport.java:162
com.groupgti.services.XmlConversionsTest:testStringToExtensionArgs @
XmlConversionsTest.java:65
Now clearly this class can be deserialized 'cos it's used in by the
web service, so what do I have to do to make it use a get().add()
instead of a set() for collections?
Thanks
Jim