users@jax-rpc.java.net

Re: Server exception when invoking web service using DII

From: kathy walsh <Kathleen.Walsh_at_Sun.COM>
Date: Mon, 01 Nov 2004 15:50:04 -0500

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
>
>