Incorrect Validation for optional sequences and choices (in case 
nillable="false")
----------------------------------------------------------------------------------

                 Key: AXIS-2737
                 URL: https://issues.apache.org/jira/browse/AXIS-2737
             Project: Axis
          Issue Type: Bug
    Affects Versions: 1.4
         Environment: Win32, JDK 1.5
            Reporter: Ronny Karallus
            Priority: Blocker


The validation inside Axis, checking the conformance of an object before 
rendering it to XML, does not work correctly for the following WSDL message 
parameter constructs:

1) A Choice, containing a sequence as one option, for example
                <xs:complexType>
                        <xs:sequence>
                                <xs:choice>
                                        <xs:sequence>
                                                <xs:element name="country" 
type="xs:string" default="+49"/>
                                                <xs:element name="short" 
type="xs:string"/>
                                        </xs:sequence>
                                        <xs:element name="long" 
type="xs:string"/>
                                </xs:choice>
                                <xs:element name="number" type="xs:string"/>
                        </xs:sequence>
                </xs:complexType>

2) A sequence, containing an optional sequence, for example:
          <xs:complexType>
            <xs:sequence>
              <xs:sequence>
                <xs:sequence minOccurs="0">
                  <xs:element name="country" type="xs:string" default="+49"/>
                  <xs:element name="short" type="xs:string"/>
                </xs:sequence>
                <xs:element name="long" type="xs:string" minOccurs="0"/>
              </xs:sequence>
              <xs:element name="number" type="xs:string"/>
            </xs:sequence>
          </xs:complexType>

To show the problem the Java Stubs are generated using WSDL2Java and the invoke 
method is called using the following code:

                LesenSoapBindingStub service = (LesenSoapBindingStub) (new 
LesenServiceLocator()).getLesen(new 
java.net.URL("http://localhost:8080/service/Lesen";));
                
                LesenRequest lesen = new LesenRequest();
                lesen.set_long("0000");
                lesen.setNumber("0000");
                
                service.invoke(lesen);

Obviously this should be possible by the WSDL, because it is the second option 
of the choice. Be aware that the code works, if you use the other option, 
setting country/short and setting long null. If you use it this way, the 
following exception is thrown:

14.04.2008 16:39:17 org.apache.axis.encoding.ser.BeanSerializer serialize
SCHWERWIEGEND: Exception:
java.io.IOException: Non nillable element 'country' is null.
        at 
org.apache.axis.encoding.ser.BeanSerializer.serialize(BeanSerializer.java:215)
        at 
org.apache.axis.encoding.SerializationContext.serializeActual(SerializationContext.java:1504)
        at 
org.apache.axis.encoding.SerializationContext.serialize(SerializationContext.java:980)
        at 
org.apache.axis.encoding.SerializationContext.serialize(SerializationContext.java:801)
        at org.apache.axis.message.RPCParam.serialize(RPCParam.java:208)
        at org.apache.axis.message.RPCElement.outputImpl(RPCElement.java:433)
        at 
org.apache.axis.message.MessageElement.output(MessageElement.java:1208)
        at org.apache.axis.message.SOAPBody.outputImpl(SOAPBody.java:139)
        at 
org.apache.axis.message.SOAPEnvelope.outputImpl(SOAPEnvelope.java:478)
        at 
org.apache.axis.message.MessageElement.output(MessageElement.java:1208)
        at org.apache.axis.SOAPPart.writeTo(SOAPPart.java:315)
        at org.apache.axis.SOAPPart.writeTo(SOAPPart.java:269)
        at org.apache.axis.SOAPPart.saveChanges(SOAPPart.java:530)
        at 
org.apache.axis.attachments.AttachmentsImpl.getAttachmentCount(AttachmentsImpl.java:554)
        at org.apache.axis.Message.getContentType(Message.java:486)
        at 
org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.java:343)
        at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:138)
        at 
org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
        at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
        at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
        at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
        at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
        at org.apache.axis.client.Call.invoke(Call.java:2767)
        at org.apache.axis.client.Call.invoke(Call.java:2443)
        at org.apache.axis.client.Call.invoke(Call.java:2366)
        at org.apache.axis.client.Call.invoke(Call.java:1812)
        at 
de.webservice.LesenSoapBindingStub.invoke(LesenSoapBindingStub.java:177)
        at Test.main(Test.java:30)
14.04.2008 16:39:17 org.apache.axis.attachments.AttachmentsImpl 
getAttachmentCount
WARNUNG: Exception:
AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
 faultSubcode: 
 faultString: java.io.IOException: java.io.IOException: Non nillable element 
'country' is null.
 faultActor: 
 faultNode: 
 faultDetail: 
        {http://xml.apache.org/axis/}stackTrace:java.io.IOException: 
java.io.IOException: Non nillable element 'country' is null.
        at 
org.apache.axis.encoding.ser.BeanSerializer.serialize(BeanSerializer.java:275)
        at 
org.apache.axis.encoding.SerializationContext.serializeActual(SerializationContext.java:1504)
        at 
org.apache.axis.encoding.SerializationContext.serialize(SerializationContext.java:980)
        at 
org.apache.axis.encoding.SerializationContext.serialize(SerializationContext.java:801)
        at org.apache.axis.message.RPCParam.serialize(RPCParam.java:208)
        at org.apache.axis.message.RPCElement.outputImpl(RPCElement.java:433)
        at 
org.apache.axis.message.MessageElement.output(MessageElement.java:1208)
        at org.apache.axis.message.SOAPBody.outputImpl(SOAPBody.java:139)
        at 
org.apache.axis.message.SOAPEnvelope.outputImpl(SOAPEnvelope.java:478)
        at 
org.apache.axis.message.MessageElement.output(MessageElement.java:1208)
        at org.apache.axis.SOAPPart.writeTo(SOAPPart.java:315)
        at org.apache.axis.SOAPPart.writeTo(SOAPPart.java:269)
        at org.apache.axis.SOAPPart.saveChanges(SOAPPart.java:530)
        at 
org.apache.axis.attachments.AttachmentsImpl.getAttachmentCount(AttachmentsImpl.java:554)
        at org.apache.axis.Message.getContentType(Message.java:486)
        at 
org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.java:343)
        at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:138)
        at 
org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
        at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
        at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
        at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
        at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
        at org.apache.axis.client.Call.invoke(Call.java:2767)
        at org.apache.axis.client.Call.invoke(Call.java:2443)
        at org.apache.axis.client.Call.invoke(Call.java:2366)
        at org.apache.axis.client.Call.invoke(Call.java:1812)
        at 
de.webservice.LesenSoapBindingStub.invoke(LesenSoapBindingStub.java:177)
        at Test.main(Test.java:30)

        {http://xml.apache.org/axis/}hostname:WUM03029

java.io.IOException: java.io.IOException: Non nillable element 'country' is 
null.
        at org.apache.axis.AxisFault.makeFault(AxisFault.java:101)
        at org.apache.axis.SOAPPart.writeTo(SOAPPart.java:317)
        at org.apache.axis.SOAPPart.writeTo(SOAPPart.java:269)
        at org.apache.axis.SOAPPart.saveChanges(SOAPPart.java:530)
        at 
org.apache.axis.attachments.AttachmentsImpl.getAttachmentCount(AttachmentsImpl.java:554)
        at org.apache.axis.Message.getContentType(Message.java:486)
        at 
org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.java:343)
        at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:138)
        at 
org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
        at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
        at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
        at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
        at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
        at org.apache.axis.client.Call.invoke(Call.java:2767)
        at org.apache.axis.client.Call.invoke(Call.java:2443)
        at org.apache.axis.client.Call.invoke(Call.java:2366)
        at org.apache.axis.client.Call.invoke(Call.java:1812)
        at 
de.webservice.LesenSoapBindingStub.invoke(LesenSoapBindingStub.java:177)
        at Test.main(Test.java:30)
Caused by: java.io.IOException: java.io.IOException: Non nillable element 
'country' is null.
        at 
org.apache.axis.encoding.ser.BeanSerializer.serialize(BeanSerializer.java:275)
        at 
org.apache.axis.encoding.SerializationContext.serializeActual(SerializationContext.java:1504)
        at 
org.apache.axis.encoding.SerializationContext.serialize(SerializationContext.java:980)
        at 
org.apache.axis.encoding.SerializationContext.serialize(SerializationContext.java:801)
        at org.apache.axis.message.RPCParam.serialize(RPCParam.java:208)
        at org.apache.axis.message.RPCElement.outputImpl(RPCElement.java:433)
        at 
org.apache.axis.message.MessageElement.output(MessageElement.java:1208)
        at org.apache.axis.message.SOAPBody.outputImpl(SOAPBody.java:139)
        at 
org.apache.axis.message.SOAPEnvelope.outputImpl(SOAPEnvelope.java:478)
        at 
org.apache.axis.message.MessageElement.output(MessageElement.java:1208)
        at org.apache.axis.SOAPPart.writeTo(SOAPPart.java:315)
        ... 17 more
14.04.2008 16:39:17 org.apache.axis.encoding.ser.BeanSerializer serialize
SCHWERWIEGEND: Exception:
java.io.IOException: Non nillable element 'country' is null.
        at 
org.apache.axis.encoding.ser.BeanSerializer.serialize(BeanSerializer.java:215)
        at 
org.apache.axis.encoding.SerializationContext.serializeActual(SerializationContext.java:1504)
        at 
org.apache.axis.encoding.SerializationContext.serialize(SerializationContext.java:980)
        at 
org.apache.axis.encoding.SerializationContext.serialize(SerializationContext.java:801)
        at org.apache.axis.message.RPCParam.serialize(RPCParam.java:208)
        at org.apache.axis.message.RPCElement.outputImpl(RPCElement.java:433)
        at 
org.apache.axis.message.MessageElement.output(MessageElement.java:1208)
        at org.apache.axis.message.SOAPBody.outputImpl(SOAPBody.java:139)
        at 
org.apache.axis.message.SOAPEnvelope.outputImpl(SOAPEnvelope.java:478)
        at 
org.apache.axis.message.MessageElement.output(MessageElement.java:1208)
        at org.apache.axis.SOAPPart.writeTo(SOAPPart.java:315)
        at org.apache.axis.SOAPPart.writeTo(SOAPPart.java:269)
        at org.apache.axis.SOAPPart.saveChanges(SOAPPart.java:530)
        at org.apache.axis.SOAPPart.getContentLength(SOAPPart.java:229)
        at org.apache.axis.Message.getContentLength(Message.java:510)
        at 
org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.java:371)
        at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:138)
        at 
org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
        at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
        at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
        at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
        at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
        at org.apache.axis.client.Call.invoke(Call.java:2767)
        at org.apache.axis.client.Call.invoke(Call.java:2443)
        at org.apache.axis.client.Call.invoke(Call.java:2366)
        at org.apache.axis.client.Call.invoke(Call.java:1812)
        at 
de.webservice.LesenSoapBindingStub.invoke(LesenSoapBindingStub.java:177)
        at Test.main(Test.java:30)
Exception in thread "main" AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
 faultSubcode: 
 faultString: java.io.IOException: java.io.IOException: Non nillable element 
'country' is null.
 faultActor: 
 faultNode: 
 faultDetail: 
        {http://xml.apache.org/axis/}stackTrace:java.io.IOException: 
java.io.IOException: Non nillable element 'country' is null.
        at 
org.apache.axis.encoding.ser.BeanSerializer.serialize(BeanSerializer.java:275)
        at 
org.apache.axis.encoding.SerializationContext.serializeActual(SerializationContext.java:1504)
        at 
org.apache.axis.encoding.SerializationContext.serialize(SerializationContext.java:980)
        at 
org.apache.axis.encoding.SerializationContext.serialize(SerializationContext.java:801)
        at org.apache.axis.message.RPCParam.serialize(RPCParam.java:208)
        at org.apache.axis.message.RPCElement.outputImpl(RPCElement.java:433)
        at 
org.apache.axis.message.MessageElement.output(MessageElement.java:1208)
        at org.apache.axis.message.SOAPBody.outputImpl(SOAPBody.java:139)
        at 
org.apache.axis.message.SOAPEnvelope.outputImpl(SOAPEnvelope.java:478)
        at 
org.apache.axis.message.MessageElement.output(MessageElement.java:1208)
        at org.apache.axis.SOAPPart.writeTo(SOAPPart.java:315)
        at org.apache.axis.SOAPPart.writeTo(SOAPPart.java:269)
        at org.apache.axis.SOAPPart.saveChanges(SOAPPart.java:530)
        at org.apache.axis.SOAPPart.getContentLength(SOAPPart.java:229)
        at org.apache.axis.Message.getContentLength(Message.java:510)
        at 
org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.java:371)
        at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:138)
        at 
org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
        at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
        at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
        at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
        at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
        at org.apache.axis.client.Call.invoke(Call.java:2767)
        at org.apache.axis.client.Call.invoke(Call.java:2443)
        at org.apache.axis.client.Call.invoke(Call.java:2366)
        at org.apache.axis.client.Call.invoke(Call.java:1812)
        at 
de.webservice.LesenSoapBindingStub.invoke(LesenSoapBindingStub.java:177)
        at Test.main(Test.java:30)

        {http://xml.apache.org/axis/}hostname:WUM03029

java.io.IOException: java.io.IOException: Non nillable element 'country' is 
null.
        at org.apache.axis.AxisFault.makeFault(AxisFault.java:101)
        at org.apache.axis.SOAPPart.writeTo(SOAPPart.java:317)
        at org.apache.axis.SOAPPart.writeTo(SOAPPart.java:269)
        at org.apache.axis.SOAPPart.saveChanges(SOAPPart.java:530)
        at org.apache.axis.SOAPPart.getContentLength(SOAPPart.java:229)
        at org.apache.axis.Message.getContentLength(Message.java:510)
        at 
org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.java:371)
        at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:138)
        at 
org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
        at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
        at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
        at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
        at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
        at org.apache.axis.client.Call.invoke(Call.java:2767)
        at org.apache.axis.client.Call.invoke(Call.java:2443)
        at org.apache.axis.client.Call.invoke(Call.java:2366)
        at org.apache.axis.client.Call.invoke(Call.java:1812)
        at 
de.webservice.LesenSoapBindingStub.invoke(LesenSoapBindingStub.java:177)
        at Test.main(Test.java:30)
Caused by: java.io.IOException: java.io.IOException: Non nillable element 
'country' is null.
        at 
org.apache.axis.encoding.ser.BeanSerializer.serialize(BeanSerializer.java:275)
        at 
org.apache.axis.encoding.SerializationContext.serializeActual(SerializationContext.java:1504)
        at 
org.apache.axis.encoding.SerializationContext.serialize(SerializationContext.java:980)
        at 
org.apache.axis.encoding.SerializationContext.serialize(SerializationContext.java:801)
        at org.apache.axis.message.RPCParam.serialize(RPCParam.java:208)
        at org.apache.axis.message.RPCElement.outputImpl(RPCElement.java:433)
        at 
org.apache.axis.message.MessageElement.output(MessageElement.java:1208)
        at org.apache.axis.message.SOAPBody.outputImpl(SOAPBody.java:139)
        at 
org.apache.axis.message.SOAPEnvelope.outputImpl(SOAPEnvelope.java:478)
        at 
org.apache.axis.message.MessageElement.output(MessageElement.java:1208)
        at org.apache.axis.SOAPPart.writeTo(SOAPPart.java:315)
        ... 17 more

Obviously the validation doesn't work correctly here. It seems as if the choice 
or sequence tags, telling that short and country do not need to be provided, 
are ignored on validation (see the attached example WSDLs).

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to