Fixed. See http://marc.theaimsgroup.com/?l=axis-dev&m=103620074508590&w=2
Thanks, dims --- Douglas Bitting <[EMAIL PROTECTED]> wrote: > 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 > > ===== Davanum Srinivas - http://xml.apache.org/~dims/ __________________________________________________ Do you Yahoo!? HotJobs - Search new jobs daily now http://hotjobs.yahoo.com/