axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Frederick N. Brier (JIRA)" <axis-...@ws.apache.org>
Subject [jira] Commented: (AXIS-2096) Custom simpleType as attribute of an element causes problems when displaying deployed service's WSDL
Date Sun, 19 Nov 2006 23:57:02 GMT
    [ http://issues.apache.org/jira/browse/AXIS-2096?page=comments#action_12451201 ] 
            
Frederick N. Brier commented on AXIS-2096:
------------------------------------------

I am just going to add a little more to what my investigations to what seems like the same
problem.  Enumeration restrictions cause a new Java class to be generated which means problems
trying to specify a Java primitive which does not have, nor need a serializer/deserializer
using SimpleSerializerFactory/SimpleDeserializerFactory.  In addition, this looks a lot like
JIRA bug#AXIS-2227, so perhaps we can kill two birds with one stone.

WSDL2Java is generating incorrect code in 3 places: deploy.wsdd, the *BindingStub.java, and
the bean containing the string with the restriction base on it.  When I modify these files
as described below, the problem goes away.  I have hacked out a patch for the moment so I
can get my current task done, but the problem really requires taking the time to understand
the underlying data model for the WSDL and schema, which I have not yet done.

The problem with the deploy.wsdd is in JavaDeployWriter.java, method writeDeployTypes() is
that mappings like the one below are being generated:

      <typeMapping
        xmlns:ns="http://schemas.mycompany.com/mynamespace"
        qname="ns:MyStringType"
        type="java:java.lang.String"
        serializer="org.apache.axis.encoding.ser.SimpleSerializerFactory"
        deserializer="org.apache.axis.encoding.ser.SimpleDeserializerFactory"
        encodingStyle=""
      />

I added the following conditional which prevents it from being output for java.lang primitives:

                   if ( ! javaType.startsWith( "java.lang." ) )
                   {
                      //###FNB: Patch to stop output of primitives.
                    writeTypeMapping(pw, namespaceURI, localPart, javaType,
                        serializerFactory, deserializerFactory,
                        encodingStyle);
                   }

The problem in the *BindingStub.java file was caused by a problem in the JavaStubWriter.java.
 It was outputting the following unnecessary lines:

            qName = new javax.xml.namespace.QName("http://schemas.omnilinksystems.com/xls",
"CountryCodeType");
            cachedSerQNames.add(qName);
            cls = java.lang.String.class;
            cachedSerClasses.add(cls);
            cachedSerFactories.add(org.apache.axis.encoding.ser.BaseSerializerFactory.createFactory(org.apache.axis.encoding.ser.SimpleSerializerFactory.class,
cls, qName));
            cachedDeserFactories.add(org.apache.axis.encoding.ser.BaseDeserializerFactory.createFactory(org.apache.axis.encoding.ser.SimpleDeserializerFactory.class,
cls, qName));

I addressed this in the writeSerializationInit() method by sticking in these two lines:

       //###FNB: Stop generation of java.lang primitives.
       if ( type.getName().startsWith( "java.lang." ) )
         return;

The problem with the bean containing the string with the restriction base on it was the setXmlType()
call:

        elemField.setXmlName(new javax.xml.namespace.QName("http://schemas.omnilinksystems.com/xls",
"MyString"));
        elemField.setXmlType(new javax.xml.namespace.QName("http://schemas.omnilinksystems.com/xls",
"MyStringType"));

The second line should actually be:

        elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema",
"string"));

In JavaBeanHelperWriter.java, in the writeMetaData() method, I added this conditional.  This
by the way is a BUG in waiting.  Restrictions on other primitive types will barf all over
this.  I just don't have the time until after Thankgiving to look at underlying Axis schema
model..

                      //###FNB: Attempt to fix bug in restriction types for strings.
                         if ( elemType.getName().startsWith( "java.lang.String" ) )
                         {
                            pw.println("        elemField.setXmlType( new javax.xml.namespace.QName(\"http://www.w3.org/2001/XMLSchema\",
\"string\" ) );");
                         }
                         else
                         {
                            pw.println("        elemField.setXmlType("
                                    + Utils.getNewQName(xmlType) + ");");
                         }


Hopefully this will help the Axis developers if they want to fix this now, or some other developer
who encounters this bug.  If I can get around to it, I will come up with a real fix and submit
a patch.


> Custom simpleType as attribute of an element causes problems when displaying deployed
service's WSDL
> ----------------------------------------------------------------------------------------------------
>
>                 Key: AXIS-2096
>                 URL: http://issues.apache.org/jira/browse/AXIS-2096
>             Project: Apache Axis
>          Issue Type: Bug
>          Components: Serialization/Deserialization
>    Affects Versions: 1.2.1
>         Environment: WinXP, Tomcat 5.5.9, jdk1.5.0_03
>            Reporter: Daniel Kador
>
> If you create a WSDL similar to the one below in wrapped/literal style, you will not
be able to create a complexType whose attribute is of a custom simpleType.  In the example
below, the following error is listed when you try to view the deployed service's WSDL through
the browser interface:
> AXIS error
> Sorry, something seems to have gone wrong... here are the details:
> Fault - Bean attribute testAttribute is of type org.apache.axis.types.NormalizedString,
which is not a simple type
> AxisFault
>  faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.generalException
>  faultSubcode: 
>  faultString: Bean attribute testAttribute is of type org.apache.axis.types.NormalizedString,
which is not a simple type
>  faultActor: 
>  faultNode: 
>  faultDetail: 
> 	{http://xml.apache.org/axis/}hostname:ORLIWG2H5Y61
> I can fix the above error by changing the attribute type from "y:testAttribute" to "xs:normalizedString".
 Is Axis designed to behave this way?  It's my understanding that XML allows for custom simpleTypes
to be defined and then used as attributes, and the schemas I work with use this feature a
good deal.  They validate with no problems in XMLSpy.  The WSDL I use in this example is posted
below.  
> <?xml version="1.0" encoding="utf-8"?>
> <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 											xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
> 			xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 
> 			xmlns:xs="http://www.w3.org/2001/XMLSchema" 
> 			xmlns:y="http://test.wsdl" 
> 			xmlns:types="http://test.wsdl/types"
> 			targetNamespace="http://test.wsdl">
> 	<wsdl:types>
> 		<xs:schema>
> 			<xs:complexType name="testType">
> 				<xs:sequence>
> 					<xs:element name="testElement" type="xs:normalizedString"/>
> 				</xs:sequence>
> 				<xs:attribute name="testAttribute" type="y:testAttribute"/>
> 			</xs:complexType>
> 			<xs:simpleType name="testAttribute">
> 				<xs:restriction base="xs:normalizedString"/>
> 			</xs:simpleType>
> 			<xs:element name="testAction">
> 				<xs:complexType>
> 					<xs:sequence>
> 						<xs:element name="testParam" type="y:testType"/>
> 					</xs:sequence>
> 				</xs:complexType>
> 			</xs:element>
> 			<xs:element name="testActionResp">
> 				<xs:complexType>
> 					<xs:sequence>
> 						<xs:element name="testResp" type="xs:string"/>
> 					</xs:sequence>
> 				</xs:complexType>
> 			</xs:element>
> 		</xs:schema>
> 	</wsdl:types>
> 	<wsdl:message name="testActionRequest">
> 		<wsdl:part name="parameters" element="y:testAction"/>
> 	</wsdl:message>
> 	<wsdl:message name="testActionResponse">
> 		<wsdl:part name="parameters" element="y:testActionResp"/>
> 	</wsdl:message>
> 	<wsdl:portType name="testPortType">
> 		<wsdl:operation name="testAction">
> 			<wsdl:input message="y:testActionRequest"/>
> 			<wsdl:output message="y:testActionResponse"/>
> 		</wsdl:operation>
> 	</wsdl:portType>
> 	<wsdl:binding name="testSoapBinding" type="y:testPortType">
> 		<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
> 		<wsdl:operation name="testAction">
> 			<wsdl:input>
> 				<soap:body use="literal"/>
> 			</wsdl:input>
> 			<wsdl:output>
> 				<soap:body use="literal"/>
> 			</wsdl:output>
> 		</wsdl:operation>
> 	</wsdl:binding>
> 	<wsdl:service name="testService">
> 		<wsdl:port name="testPort" binding="y:testSoapBinding">
> 			<soap:address location="http://localhost:8080/axis/services/testPort"/>
> 		</wsdl:port>
> 	</wsdl:service>
> </wsdl:definitions>

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-dev-help@ws.apache.org


Mime
View raw message