Hi.
I recently filed a Bugzilla report
(http://nagoya.apache.org/bugzilla/show_bug.cgi?id=14182) on this issue. I hope
someone else can come up with a
fix faster than I can... however, it's rather a serious problem for me, so I'm trying
to puzzle through this myself. Here's what I've found thus far.
In org.apache.axis.encoding.DefaultTypeMappingImpl, you find the following during
default type mapping initialization:
// The closest match for anytype is Object
myRegister(Constants.XSD_ANYTYPE, java.lang.Object.class,
null, null);
This causes "xsd:anyType" to be bound to java.lang.Object. This registration sets up
a number of mappings, including QName->JavaType and
JavaType->QName. It's the latter of these which plays a part in this defect.
When registering a QName that is part of the XML Schema Namespace, Axis registers that
mapping for all versions of the XML Schema. Thus, the above
will cause the following QName->JavaType mappings:
1) {http://www.w3.org/1999/XMLSchema}anyType -> java.lang.Object
2) {http://www.w3.org/2000/10/XMLSchema}anyType -> java.lang.Object
3) {http://www.w3.org/2001/XMLSchema}anyType ->java.lang.Object
The order of the above is the order in which this internal registering happens. The
"problemmatic" portion of this is the setting up of the
JavaType->QName mapping. In this case, since the same Java type is the key of the
map, only the first mapping is used. This is ensured by the
following code, found in org.apache.axis.encoding.TypeMappingImpl#internalRegister
(Line 290):
if ((sf != null) || (class2Pair.get(javaType) == null))
class2Pair.put(javaType, pair);
This code ensures that a JavaType->QName mapping is not overridden. I don't know if
this is wrong behavior or not... but it's the current
functionality.
Later on in the WSDL-generation process, the actual WSDL Messages and Parts are
constructed. As part of this construction, the ParameterDesc for the
java.lang.Object object is retrieved, and the getTypeQName method is called on this
ParameterDesc. This always returns
{http://www.w3.org/1999/XMLSchema}anyType since that was the first type mapping
registered for java.lang.Object.
When Types.writeType for this QName is invoked, this is shortcircuited to always emit
"xsd:anyType," where "xsd" presumably is supposed to be the
latest support XML Schema version (i.e., http://www.w3.org/2001/XMLSchema, right now).
I think this might be meaningless data for this issue.
Finally, when handed off to WSDL4J in order to convert the generated WSDL to an XML
Document, WSDL4J will eventually call ParameterDesc.getTypeQName
for java.lang.Object and receive {http://www.w3.org/1999/XMLSchema}anyType. However,
this XML Namespace has net been registered with the XML
Document, hence an exception is raised...
So, that's what I know. I don't know if the solution is to be found somewhere in the
above, or if it is somewhere else. However, the crux of the
issue seems to be that the JavaType->QName mapping is only accepting the first mapping
passed its way. It seems that it should employ a
last-one-registered wins tactic when dealing with this... and in fact, that's the
tactic employed if a serialization factory is provided during
registration. However, since java.lang.Object doesn't provide a serialization
factory, it ends up with this somewhat odd behavior.
Is the right thing simply to special case TypeMappingImpl#internalRegister so that
java.lang.Object employs a last-one-registered wins behavior?
Something else?
Cheers,
--Doug
Doug Bitting
Agile Software
1 Almaden Blvd
San Jose, CA 95113
(408) 999-7120