Problem with methods returning an attachment
bernhard_pauler Sep 18, 2007 4:01 PMI have a nasty problem.
Some methods of my web service should return an attachment.
I start with a handwritten WSDL file and generate the necessary artifacts and descriptors using JAX-RPC tools.
There are no warning or error messages at deploy time.
An error occurs after invoking the method:
16:27:34,485 ERROR [SOAPFaultHelperJAXRPC] SOAP request exception
org.jboss.ws.WSException: Operation does not have a return value: {http://myservice.mycompany.com/myservice}getTemplate
I can't figure out why JBoss behaves that way - can somebody help me with this?
Thanks,
Bernhard
Here are of the relevant files:
MyService.wsdl:
<?xml version="1.0" encoding="utf-8"?> <definitions name="MyService" xmlns ="http://schemas.xmlsoap.org/wsdl/" xmlns:soap ="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:mime ="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:xsd ="http://www.w3.org/2001/XMLSchema" xmlns:tns ="http://myservice.mycompany.com/myservice" targetNamespace="http://myservice.mycompany.com/myservice"> <types> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://myservice.mycompany.com/myservice"> <element name="getTemplate"> <complexType> <sequence> <element name="templateId" type="xsd:int"/> </sequence> </complexType> </element> <element name="MyServiceFault"> <complexType> <sequence> <element name="errorCode" type="xsd:string"/> <element name="errorMessage" type="xsd:string"/> </sequence> </complexType> </element> </schema> </types> <message name="getTemplateRequest"> <part name="parameters" element="tns:getTemplate"/> </message> <message name="getTemplateResponse"> <part name="template" type="xsd:hexBinary"/> </message> <message name="MyServiceFaultMessage"> <part name="fault" element="tns:MyServiceFault"/> </message> <portType name="MyServiceEndpoint"> <operation name="getTemplate"> <input message="tns:getTemplateRequest"/> <output message="tns:getTemplateResponse"/> <fault name="MyServiceFault" message="tns:MyServiceFaultMessage"/> </operation> </portType> <binding name="MyServiceEndpointBinding" type="tns:MyServiceEndpoint"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="getTemplate"> <input> <soap:body use="literal"/> </input> <output> <mime:multipartRelated> <mime:part> <soap:body use="literal"/> </mime:part> <mime:part> <mime:content part="template" type="application/*"/> </mime:part> </mime:multipartRelated> </output> <fault name="MyServiceFault"> <soap:fault name="MyServiceFault" use="literal"/> </fault> </operation> </binding> <service name="MyService"> <port name="MyServiceEndpointPort" binding="tns:MyServiceEndpointBinding"> <soap:address location="REPLACE_WITH_ACTUAL_URL"/> </port> </service> </definitions>
jaxrpc-mapping.xml:
<?xml version="1.0" encoding="UTF-8"?> <java-wsdl-mapping xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.1" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://www.ibm.com/webservices/xsd/j2ee_jaxrpc_mapping_1_1.xsd"> <package-mapping> <package-type>com.mycompany.myservice</package-type> <namespaceURI>http://myservice.mycompany.com/myservice</namespaceURI> </package-mapping> <java-xml-type-mapping> <java-type>com.mycompany.myservice.MyServiceFault</java-type> <anonymous-type-qname xmlns:typeNS="http://myservice.mycompany.com/myservice">typeNS:>MyServiceFault</anonymous-type-qname> <qname-scope>complexType</qname-scope> <variable-mapping> <java-variable-name>errorCode</java-variable-name> <xml-element-name>errorCode</xml-element-name> </variable-mapping> <variable-mapping> <java-variable-name>errorMessage</java-variable-name> <xml-element-name>errorMessage</xml-element-name> </variable-mapping> </java-xml-type-mapping> <java-xml-type-mapping> <java-type>com.mycompany.myservice.GetTemplate</java-type> <anonymous-type-qname>http://myservice.mycompany.com/myservice:>getTemplate</anonymous-type-qname> <qname-scope>complexType</qname-scope> <variable-mapping> <java-variable-name>templateId</java-variable-name> <xml-element-name>templateId</xml-element-name> </variable-mapping> </java-xml-type-mapping> <exception-mapping> <exception-type>com.mycompany.myservice.MyServiceFault</exception-type> <wsdl-message xmlns:exMsgNS="http://myservice.mycompany.com/myservice">exMsgNS:MyServiceFaultMessage</wsdl-message> <constructor-parameter-order> <element-name>errorCode</element-name> <element-name>errorMessage</element-name> </constructor-parameter-order> </exception-mapping> <service-interface-mapping> <service-interface>com.mycompany.myservice.MyService</service-interface> <wsdl-service-name xmlns:serviceNS="http://myservice.mycompany.com/myservice">serviceNS:MyService</wsdl-service-name> <port-mapping> <port-name>MyServiceEndpointPort</port-name> <java-port-name>MyServiceEndpointPort</java-port-name> </port-mapping> </service-interface-mapping> <service-endpoint-interface-mapping> <service-endpoint-interface>com.mycompany.myservice.MyServiceEndpoint</service-endpoint-interface> <wsdl-port-type xmlns:portTypeNS="http://myservice.mycompany.com/myservice">portTypeNS:MyServiceEndpoint</wsdl-port-type> <wsdl-binding xmlns:bindingNS="http://myservice.mycompany.com/myservice">bindingNS:MyServiceEndpointBinding</wsdl-binding> <service-endpoint-method-mapping> <java-method-name>getTemplate</java-method-name> <wsdl-operation>getTemplate</wsdl-operation> <wrapped-element/> <method-param-parts-mapping> <param-position>0</param-position> <param-type>int</param-type> <wsdl-message-mapping> <wsdl-message xmlns:wsdlMsgNS="http://myservice.mycompany.com/myservice">wsdlMsgNS:getTemplateRequest</wsdl-message> <wsdl-message-part-name>templateId</wsdl-message-part-name> <parameter-mode>IN</parameter-mode> </wsdl-message-mapping> </method-param-parts-mapping> <wsdl-return-value-mapping> <method-return-value>javax.activation.DataHandler</method-return-value> <wsdl-message xmlns:wsdlMsgNS="http://myservice.mycompany.com/myservice">wsdlMsgNS:getTemplateResponse</wsdl-message> <wsdl-message-part-name>template</wsdl-message-part-name> </wsdl-return-value-mapping> </service-endpoint-method-mapping> </service-endpoint-interface-mapping> </java-wsdl-mapping>
MyServiceEndpoint.java:
package com.mycompany.myservice; public interface MyServiceEndpoint extends java.rmi.Remote { public javax.activation.DataHandler getTemplate(int templateId) throws com.mycompany.myservice.MyServiceFault, java.rmi.RemoteException; }