[
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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]