Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
Java-SCA-1.1, Java-SCA-1.3
-
None
-
Windows XP; IBM J2RE 1.5.0 (Build 2.3)
Description
1. Create a component with a java implementation, with a service defined by a Java interface.
The parameter to the method is not a String, primitive or wrapper - rather, it's a class containing a couple of Strings and an Integer.
2. Expose the service with a webservice binding.
3. Deploy the composite (as a WAR or embedded).
4. Retrieve the WSDL for the service (eg from http://localhost:8080/SomeServices?wsdl).
5. Generate a web service request from the WSDL.
The runtime fails to map the web service request message to the implementation class method parameters - it calls the correct method, but the method parameter is null.
The test works fine when the parameter is a String.
Composite definition (some.composite):
-------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" targetNamespace="http://test" xmlns:test="http://test" name="some">
<service name="SomeServices" promote="SomeServicesComponent">
<binding.ws uri="http://localhost:8080/SomeServices"/>
</service>
<component name="SomeServicesComponent">
<implementation.java class="service.SomeServiceImpl"/>
<service name="SomeService">
<interface.java interface="service.SomeService" />
</service>
</component>
</composite>
Service interface:
-----------------------
/**
*/
package service;
import org.osoa.sca.annotations.Remotable;
@Remotable
public interface SomeService {
public AnObject getUsingString(String stringParam);
public AnObject getUsingMoreComplexObject(MoreComplexObject moreComplexParam);
}
Implementation:
----------------------
package service;
import org.osoa.sca.annotations.Service;
@Service(SomeService.class)
public class SomeServiceImpl implements SomeService {
public AnObject getUsingString(String stringParam)
{ System.out.println("Param value:" + stringParam); return getAnObject(stringParam); }private AnObject getAnObject(String stringParam)
{ // TODO Auto-generated method stub return new AnObject(stringParam + "123", 123); }public AnObject getUsingMoreComplexObject(MoreComplexObject moreComplexParam)
{ System.out.println("Param value:" + moreComplexParam.getStringParam()); return getAnObject(moreComplexParam.getStringParam()); }
}
MoreComplexObject.java
-----------------------------------
/**
*/
package service;
import java.io.Serializable;
public class MoreComplexObject implements Serializable{
private static final long serialVersionUID = 43242314234123L;
private String stringParam;
private Integer intParam;
private String stringParam2;
public String getStringParam()
{ return stringParam; }public void setStringParam(String stringParam)
{ this.stringParam = stringParam; }public Integer getIntParam()
{ return intParam; }public void setIntParam(Integer intParam)
{ this.intParam = intParam; }public String getStringParam2()
{ return stringParam2; }public void setStringParam2(String stringParam2)
{ this.stringParam2 = stringParam2; }}
AnObject.java
-------------
package service;
public class AnObject {
private String someRetValue;
private Integer someOtherRetValue;
public AnObject() {
}
public AnObject(String someRetValue, Integer someOtherRetValue)
/**
- @return the someOtherRetValue
*/
public Integer getSomeOtherRetValue() { return someOtherRetValue; }/**
- @param someOtherRetValue the someOtherRetValue to set
*/
public void setSomeOtherRetValue(Integer someOtherRetValue) { this.someOtherRetValue = someOtherRetValue; }/**
- @return the someRetValue
*/
public String getSomeRetValue() { return someRetValue; }/**
- @param someRetValue the someRetValue to set
*/
public void setSomeRetValue(String someRetValue) { this.someRetValue = someRetValue; }
}
WSDL returned by http://localhost:8080/SomeServices?wsdl
-------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://service" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns0="http://service/xsd" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:ns1="http://service">
<wsdl:types>
<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://service/xsd" xmlns:ax21="http://service/xsd">
<xs:complexType name="MoreComplexObject">
<xs:sequence>
<xs:element minOccurs="0" name="intParam" nillable="true" type="xs:int"/>
<xs:element minOccurs="0" name="stringParam" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="stringParam2" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="AnObject">
<xs:sequence>
<xs:element minOccurs="0" name="someOtherRetValue" nillable="true" type="xs:int"/>
<xs:element minOccurs="0" name="someRetValue" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://service" xmlns:ns="http://service">
<xs:element name="getUsingMoreComplexObject">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="param0" nillable="true" type="ns0:MoreComplexObject"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getUsingMoreComplexObjectResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="return" nillable="true" type="ns0:AnObject"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getUsingString">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="param0" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getUsingStringResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="return" nillable="true" type="ns0:AnObject"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
<wsdl:message name="getUsingStringResponse">
<wsdl:part name="parameters" element="ns1:getUsingStringResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getUsingMoreComplexObjectResponse">
<wsdl:part name="parameters" element="ns1:getUsingMoreComplexObjectResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getUsingStringRequest">
<wsdl:part name="parameters" element="ns1:getUsingString">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getUsingMoreComplexObjectRequest">
<wsdl:part name="parameters" element="ns1:getUsingMoreComplexObject">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="SomeServicePortType">
<wsdl:operation name="getUsingString">
<wsdl:input message="ns1:getUsingStringRequest" wsaw:Action="urn:getUsingString">
</wsdl:input>
<wsdl:output message="ns1:getUsingStringResponse" wsaw:Action="urn:getUsingStringResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getUsingMoreComplexObject">
<wsdl:input message="ns1:getUsingMoreComplexObjectRequest" wsaw:Action="urn:getUsingMoreComplexObject">
</wsdl:input>
<wsdl:output message="ns1:getUsingMoreComplexObjectResponse" wsaw:Action="urn:getUsingMoreComplexObjectResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="SomeServiceHttpBinding" type="ns1:SomeServicePortType">
<http:binding verb="POST"/>
<wsdl:operation name="getUsingString">
<http:operation location="SomeService/getUsingString"/>
<wsdl:input>
<mime:content part="getUsingString" type="text/xml"/>
</wsdl:input>
<wsdl:output>
<mime:content part="getUsingString" type="text/xml"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getUsingMoreComplexObject">
<http:operation location="SomeService/getUsingMoreComplexObject"/>
<wsdl:input>
<mime:content part="getUsingMoreComplexObject" type="text/xml"/>
</wsdl:input>
<wsdl:output>
<mime:content part="getUsingMoreComplexObject" type="text/xml"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="SomeServiceSOAP11Binding" type="ns1:SomeServicePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getUsingString">
<soap:operation soapAction="urn:getUsingString" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getUsingMoreComplexObject">
<soap:operation soapAction="urn:getUsingMoreComplexObject" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="SomeServicePortType__SOAPBinding" type="ns1:SomeServicePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getUsingString">
<soap:operation soapAction=""/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getUsingMoreComplexObject">
<soap:operation soapAction=""/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="SomeService">
<wsdl:port name="SomeServiceHttpport" binding="ns1:SomeServiceHttpBinding">
<http:address location="http://localhost:8080/SomeServices"/>
</wsdl:port>
<wsdl:port name="SomeServiceSOAP11port_http" binding="ns1:SomeServiceSOAP11Binding">
<soap:address location="http://localhost:8080/SomeServices"/>
</wsdl:port>
</wsdl:service>
<wsdl:service name="SomeServicePortType__Service">
<wsdl:port name="SomeServicePortType_SOAPHTTPPort" binding="ns1:SomeServicePortType_SOAPBinding">
<soap:address location="http://localhost:8080/SomeServices"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
SOAP payload:
--------------------
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service" xmlns:xsd="http://service/xsd">
<soapenv:Header/>
<soapenv:Body>
<ser:getUsingMoreComplexObject>
<ser:param0>
<xsd:intParam>12</xsd:intParam>
<xsd:stringParam>Param_1</xsd:stringParam>
<xsd:stringParam2>Param2</xsd:stringParam2>
</ser:param0>
</ser:getUsingMoreComplexObject>
</soapenv:Body>
</soapenv:Envelope>