users@jax-rpc.java.net

RE: Server exception when invoking web service using DII

From: Ryan LeCompte <ryan.lecompte_at_pangonetworks.com>
Date: Tue, 2 Nov 2004 09:38:35 -0500

Kathy,
 
I was able to modify the WSDL further so that it works with DII. I basically
made the custom WSDL look almost identical to what wscompile would
automatically generate if given the regular Java endpoint interface.
However, I'm quite puzzled as to why DII requires the WSDL to look this way.
It started working once I changed the <complexType name="tData"> to be
<complexType name="handleData"> and also when I changed <element
name="data" type="tns:tData"/> to be <element name="data"
type="tns:handleData"/>. It appears that DII will only work when the name of
the complex type is exactly the same as the name of an operation (note that
there is a single operation named "handleData"). Otherwise, I get the
server-side exception:
 
Nov 2, 2004 9:33:02 AM com.sun.xml.rpc.server.StreamingHandler handle
SEVERE: unrecognized operation:
{urn:com.test.webservice/types/TestWebService}Da
ta
unrecognized operation: {urn:com.test.webservice/types/TestWebService}Data
        at
com.test.webservice.TestWebService_PortType_Tie.peekFirstBodyElement(
TestWebService_PortType_Tie.java:76)
 
Etc...
 
I really would hate having to name the complex types exactly the way that
the operations are named, since this makes the WSDL a bit harder to read. Is
there something that I'm not doing (perhaps namespace-related) that is only
making this WSDL work when the complex types are named the same as the
operations?
 
Thank you,
 
-- Ryan



  _____

From: Ryan LeCompte [mailto:ryan.lecompte_at_pangonetworks.com]
Sent: Monday, November 01, 2004 9:03 PM
To: 'users_at_jax-rpc.dev.java.net'
Subject: RE: Server exception when invoking web service using DII


Kathy,
 
I used the tcpmon utility to capture the incoming SOAP messages for the
stub-based and DII-based clients. I also modified the WSDL a bit in hopes of
getting it in a form that will work with DII, but I'm still seeing the SOAP
fault (exception in server). Here is the modified WSDL file and SOAP
snippets from the tcpmon utility:
 
I. WSDL
 
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="TestWebService"
   targetNamespace="urn:com.test.webservice/wsdl/TestWebService"
   xmlns:tns="urn:com.test.webservice/wsdl/TestWebService"
   xmlns=" <http://schemas.xmlsoap.org/wsdl/>
http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="
<http://www.w3.org/2001/XMLSchema> http://www.w3.org/2001/XMLSchema"
   xmlns:soap=" <http://schemas.xmlsoap.org/wsdl/soap/>
http://schemas.xmlsoap.org/wsdl/soap/"
   xmlns:ns2="urn:com.test.webservice/types/TestWebService">
 <types>
  <schema targetNamespace="urn:com.test.webservice/types/TestWebService"
     xmlns:tns="urn:com.test.webservice/types/TestWebService"
      xmlns:soap11-enc=" <http://schemas.xmlsoap.org/soap/encoding/>
http://schemas.xmlsoap.org/soap/encoding/"
            xmlns:xsi=" <http://www.w3.org/2001/XMLSchema-instance>
http://www.w3.org/2001/XMLSchema-instance"
            xmlns:wsdl=" <http://schemas.xmlsoap.org/wsdl/>
http://schemas.xmlsoap.org/wsdl/"
            xmlns=" <http://www.w3.org/2001/XMLSchema>
http://www.w3.org/2001/XMLSchema">
 
   <complexType name="tData">
    <sequence>
     <element name="arrayOfData" type="tns:tDatum" nillable="false"
        minOccurs="1" maxOccurs="unbounded"/>
    </sequence>
   </complexType>
   <complexType name="tDatum">
    <sequence>
     <element name="dataOne" type="string" nillable="false"/>
     <element name="dataTwo" type="string" nillable="false"/>
    </sequence>
   </complexType>
   <element name="data" type="tns:tData"/>
  </schema>
 </types>
 
 <message name="TestWebService_handleData">
  <part name="parameters" element="ns2:data"/>
 </message>
 
 <portType name="TestWebServicePortType">
  <operation name="handleData">
   <input message="tns:TestWebService_handleData"/>
  </operation>
 </portType>
   
 <binding name="TestWebServiceBinding" type="tns:TestWebServicePortType">
  <soap:binding transport=" <http://schemas.xmlsoap.org/soap/http>
http://schemas.xmlsoap.org/soap/http" style="document"/>
  <operation name="handleData">
   <soap:operation soapAction="TestWebService/handleData"/>
   <input>
    <soap:body use="literal"/>
   </input>
  </operation>
 </binding>
 
 <service name="TestWebService">
  <port name="TestWebServicePort" binding="tns:TestWebServiceBinding">
   <soap:address location="TODO REPLACE_WITH_ACTUAL_URL"/>
  </port>
 </service>
</definitions>
 
II. SOAP message for stub-based client
 
<?xml version="1.0" encoding="UTF-8"?>

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:enc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns0="urn:com.test.webservice/types/TestWebService">

<env:Body>

<ns0:data>

<arrayOfData>

<dataOne>One</dataOne>

<dataTwo>Two</dataTwo>

</arrayOfData>

</ns0:data>

</env:Body>

</env:Envelope>

III. SOAP message for DII-based client

<?xml version="1.0" encoding="UTF-8"?>

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:enc="http://schemas.xmlsoap.org/soap/encoding/">

<env:Body>

<ans1:tData xmlns:ans1="urn:com.test.webservice/types/TestWebService">

<arrayOfData>

<dataOne>One</dataOne>

<dataTwo>Two</dataTwo>

</arrayOfData>

</ans1:tData>

</env:Body>

</env:Envelope>

Which generates the following fault response:

HTTP/1.1 500 Internal Server Error

SOAPAction: ""

Content-Type: text/xml;charset=utf-8

Transfer-Encoding: chunked

Date: Tue, 02 Nov 2004 01:51:15 GMT

Server: Sun-Java-System/Web-Services-Pack-1.4

Connection: close

236

<?xml version="1.0" encoding="UTF-8"?>

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:enc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns0="urn:com.test.webservice/types/TestWebService">

<env:Body>

<env:Fault>

<faultcode>env:Client</faultcode>

<faultstring>JAXRPCTIE01: caught exception while handling request:
unrecognized operation:
{urn:com.test.webservice/types/TestWebService}tData</faultstring>

</env:Fault>

</env:Body>

</env:Envelope>

I'm still not sure if I have the operations defined with a namespace as you
mentioned. Any further insight you can provide is much appreciated!

Regards,

-- Ryan


  _____

From: kathy walsh [mailto:Kathleen.Walsh_at_Sun.COM]
Sent: Monday, November 01, 2004 4:21 PM
To: users_at_jax-rpc.dev.java.net
Subject: Re: Server exception when invoking web service using DII


If you can view the xml stream that is output from both the
stub and the dii client using a tool like tcptunnel or tcpMonitor-
or write one yourself-
By viewing the differences, you may see what is not serializing properly.
In order to tweak the serializer you need to use the -keep option with
wscompile
Based on what you find, review the generated serializer code and examine
look at
the area that you have found that is different on the sent dii xml stream.
Try tweaking that area of code

Another thought is that there is no namespace set on the operation .
Literal web services with dii and dynamic proxies will error if
the namespaces are not set correctly-I would try this first before teaking
the serializer.

Kathy

Ryan LeCompte wrote:


Kathy,
 
Thank you for responding. You mention that I may have to tweak the generated
serializer code from wscompile to make this work with DII. Can you shed a
bit more guidance in how I would go about doing that? What would need to
change?
 
Thank you,
 
-- Ryan

  _____

From: kathy walsh [mailto:Kathleen.Walsh_at_Sun.COM]
Sent: Monday, November 01, 2004 3:50 PM
To: users_at_jax-rpc.dev.java.net
Subject: Re: Server exception when invoking web service using DII


Ryan-

You may have to tweak the serializer code generated from
wscompile in order to use this with a DII client.
Let me know if you need more help with this-
Kathy


Ryan LeCompte wrote:

Hello,
 
I'm having a problem invoking a JAX-RPC web service implementation that is
generated from a custom WSDL file using DII in a JAX-RPC client. I can
invoke this web service using generated stubs without any problems. When I
invoke the remote web service using DII, an exception is generated on the
server. I'm using JWSDP 1.4. I've attempted to write a fairly small "test"
WSDL and JAX-RPC client to demonstrate the problem:
 
I. TestWebService WSDL
 
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="TestWebService"
   targetNamespace="urn:com.test.webservice/wsdl"
   xmlns:tns="urn:com.test.webservice/wsdl"
   xmlns:xsdns="urn:com.test.webservice/types"
   xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
   xmlns="http://schemas.xmlsoap.org/wsdl/">
 <types>
  <schema targetNamespace="urn:com.test.webservice/types"
     xmlns:tns="urn:com.test.webservice/types"
     xmlns="http://www.w3.org/2001/XMLSchema">
   <complexType name="tData">
    <sequence>
     <element name="arrayOfData" type="tns:tDatum" nillable="false"
        minOccurs="1" maxOccurs="unbounded"/>
    </sequence>
   </complexType>
   <complexType name="tDatum">
    <sequence>
     <element name="dataOne" type="string" nillable="false"/>
     <element name="dataTwo" type="string" nillable="false"/>
    </sequence>
   </complexType>
   <element name="data" type="tns:tData"/>
  </schema>
 </types>
 
 <message name="TestWebService_handleData">
  <part name="parameters" element="xsdns:data"/>
 </message>
 
 <portType name="TestWebServicePortType">
  <operation name="handleData">
   <input message="tns:TestWebService_handleData"/>
  </operation>
 </portType>
   
 <binding name="TestWebServiceBinding" type="tns:TestWebServicePortType">
  <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document"/>
  <operation name="handleData">
   <soap:operation soapAction="TestWebService/handleData"/>
   <input>
    <soap:body use="literal"/>
   </input>
  </operation>
 </binding>
 
 <service name="TestWebService">
  <port name="TestWebServicePort" binding="tns:TestWebServiceBinding">
   <soap:address location="TODO REPLACE_WITH_ACTUAL_URL"/>
  </port>
 </service>
</definitions>
 
II. Test JAX-RPC client using stubs and DII
 
-- note that the server exception is generated only when the DII
Call.invokeOneWay is executed, not the stub call
-- also note that the method registerSerializers() was added since it
appears that the custom serializers must be registered explicitly in the
client code (the register serializer code was essentially copied/pasted from
the auto-generated code from wscompile)
 
public class TestWebServiceClient implements SerializerConstants {
    private static final String SERVICE_URI =
"urn:com.test.webservice/wsdl";
      
    public static void main(String[] args) {
        String STUB_ADDR =
"http://localhost:8080/TestService/TestWebService";
        String DII_ADDR =
"http://localhost:8080/TestService/TestWebService?WSDL";
        
        try {
            TestWebService_Impl serviceImpl = new TestWebService_Impl();
            TestWebServicePortType stub =
(TestWebServicePortType)serviceImpl.getTestWebServicePort();
            ((Stub)stub)._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY,
STUB_ADDR);
            
            // Create and send multiple Datum objects via stub.
            TDatum[] data = new TDatum[5];
            for (int i = 0; i < data.length; i++) {
              data[i] = new TDatum();
              data[i].setDataOne("One");
              data[i].setDataTwo("Two");
            }
            stub.handleData(data);
           
            // Create and send multiple Datum objects via DII.
            String BODY_NAMESPACE_VALUE = SERVICE_URI;
            String ENCODING_STYLE_PROPERTY
="javax.xml.rpc.encodingstyle.namespace.uri";
            String serviceName = "TestWebService";
            String portName = "TestWebServicePort";
            Service service = null;
            QName port = null;
            ServiceFactory factory = ServiceFactory.newInstance();
            service = factory.createService(new URL(DII_ADDR), new
QName(BODY_NAMESPACE_VALUE, serviceName));
            
            registerSerializers(service);
            port = new QName(BODY_NAMESPACE_VALUE, portName);
            QName operation = new QName("handleData");
            Call call = service.createCall(port, operation);
            call.setProperty(Call.SOAPACTION_USE_PROPERTY, new
Boolean(true));
            call.setProperty(Call.SOAPACTION_URI_PROPERTY,
"TestWebService/handleData");
            call.setProperty(ENCODING_STYLE_PROPERTY, "");
            call.setProperty(Call.OPERATION_STYLE_PROPERTY, "document");
            Object[] params = new Object[] { new TData(data) };
            call.invokeOneWay(params);
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
    
    private static void registerSerializers(Service service) {
       TypeMappingRegistry registry = service.getTypeMappingRegistry();
       TypeMapping mapping12 =
registry.getTypeMapping(SOAP12Constants.NS_SOAP_ENCODING);
       TypeMapping mapping =
registry.getTypeMapping(SOAPConstants.NS_SOAP_ENCODING);
       TypeMapping mapping2 = registry.getTypeMapping("");
        
        {
            QName type = new QName("urn:com.test.webservice/types",
"tData");
            CombinedSerializer serializer = new
com.test.webservice.TData_LiteralSerializer(type, "", DONT_ENCODE_TYPE);
            registerSerializer(mapping2,com.test.webservice.TData.class,
type, serializer);
        }
        {
            QName type = new QName("urn:com.test.webservice/types",
"tDatum");
            CombinedSerializer serializer = new
com.test.webservice.TDatum_LiteralSerializer(type, "", DONT_ENCODE_TYPE);
            registerSerializer(mapping2,com.test.webservice.TDatum.class,
type, serializer);
        }
    }
    
     private static void registerSerializer(TypeMapping mapping, Class
javaType, QName xmlType,
        Serializer ser) {
        mapping.register(javaType, xmlType, new
SingletonSerializerFactory(ser),
            new SingletonDeserializerFactory((Deserializer)ser));
    }
    
}
 
III. Server-side exception
 
When I invoke the remote web service using DII, the following exception is
generated on the server:
 
Nov 1, 2004 2:20:24 PM com.sun.xml.rpc.server.StreamingHandler handle
SEVERE: unrecognized operation: {urn:com.test.webservice/types}tData
unrecognized operation: {urn:com.test.webservice/types}tData
        at
com.test.webservice.TestWebServicePortType_Tie.peekFirstBodyElement(T
estWebServicePortType_Tie.java:76)
        at
com.sun.xml.rpc.server.StreamingHandler.handle(StreamingHandler.java:
218)
        at
com.sun.xml.rpc.server.http.JAXRPCServletDelegate.doPost(JAXRPCServle
tDelegate.java:443)
        at
com.sun.xml.rpc.server.http.JAXRPCServlet.doPost(JAXRPCServlet.java:8
6)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:237)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:157)
        at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV
alve.java:214)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
eContext.java:104)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
a:520)
        at
org.apache.catalina.core.StandardContextValve.invokeInternal(Standard
ContextValve.java:198)
        at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextV
alve.java:152)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
eContext.java:104)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
a:520)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j
ava:137)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
eContext.java:104)
        at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j
ava:117)
        at
org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
eContext.java:102)
        at
org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
a:520) ...... (rest of exception omitted)
 
At first I thought that there was a problem with my WSDL, but that shouldn't
be the case since the stub-based JAX-RPC client code works without any
problems. Also, the DII code doesn't generate any client-side exceptions
when invoked.
 
Any help is much appreciated!
 
Regards,
 
-- Ryan