Soap with Attachments - Unmarshalling Error

ayibogan

Grünschnabel
Versuche grad mit Eclipse und CXF mit SOAP 1.2 Binding und dem Oracle Tutorial ein Testprojekt zu erstellen, bekomme aber leider ein Fehler. Einfache Parameter wie String, int usw. machen keine Probleme.

Webservice:
Code:
package de;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.soap.AttachmentPart;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;

@WebService(targetNamespace = "http://de/", endpointInterface = "de.EndPoint", portName = "WebServicePort", serviceName = "WebServiceService")
public class test implements EndPoint{

	@WebMethod(operationName = "create", action = "urn:Create")
	public String create(@WebParam(name = "arg0") SOAPMessage message) {

		java.util.Iterator iterator = message.getAttachments();
		while (iterator.hasNext()) {
			AttachmentPart attachment = (AttachmentPart) iterator.next();
			String id = attachment.getContentId();
			String type = attachment.getContentType();
			if (type.equals("text/plain")) {
				Object content = null;
				try {
					content = attachment.getContent();
				} catch (SOAPException e) {
					e.printStackTrace();
				}
				System.out.println("Attachment contains:\n" + content);
			}
		}
		return "CREATED!";
	}
}

WSDL:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="WebServiceService" targetNamespace="http://de/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://de/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/">
  <wsdl:types>
    <schema xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://de/" schemaLocation="webservice_schema1.xsd"/>
</schema>
  </wsdl:types>
  <wsdl:message name="createResponse">
    <wsdl:part name="parameters" element="tns:createResponse">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="create">
    <wsdl:part name="parameters" element="tns:create">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="EndPoint">
    <wsdl:operation name="create">
      <wsdl:input name="create" message="tns:create">
    </wsdl:input>
      <wsdl:output name="createResponse" message="tns:createResponse">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="WebServiceServiceSoapBinding" type="tns:EndPoint">
    <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="create">
      <soap12:operation soapAction="urn:Create" style="document"/>
      <wsdl:input name="create">
        <soap12:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="createResponse">
        <soap12:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="WebServiceService">
    <wsdl:port name="WebServicePort" binding="tns:WebServiceServiceSoapBinding">
      <soap12:address location="http://localhost:8080/WebServiceSOAP/services/WebServicePort"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

XSD:
Code:
<?xml version="1.0" encoding="utf-8"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://de/" elementFormDefault="unqualified" targetNamespace="http://de/" version="1.0">
<xs:element name="create" type="tns:create"/>
<xs:element name="createResponse" type="tns:createResponse"/>
<xs:complexType name="create">
    <xs:sequence>
      <xs:element minOccurs="0" name="arg0" type="tns:soapMessage"/>
    </xs:sequence>
  </xs:complexType>
<xs:complexType abstract="true" name="soapMessage">
    <xs:sequence>
      <xs:element minOccurs="0" name="contentDescription" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
<xs:complexType name="createResponse">
    <xs:sequence>
      <xs:element minOccurs="0" name="return" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

Endpoint:

Code:
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;

@WebService(name = "EndPoint", targetNamespace = "http://de/")
public interface EndPoint {

	@WebMethod(operationName = "create", action = "urn:Create")
	public String create(@WebParam(name = "arg0") SOAPMessage message);

}

Client:
Code:
	public static void create() throws Exception {
		QName serviceName = new QName("http://de/", "WebServiceService");
		QName portName = new QName("http://de/", "WebServicePort");

		Service service = Service.create(serviceName);
		service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING,
				"http://localhost:8080/WebServiceSOAP/services/WebServicePort?wsdl");
		de.EndPoint client = service.getPort(portName, de.EndPoint.class);

		MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
		SOAPMessage message = factory.createMessage();
		AttachmentPart attachment = message.createAttachmentPart();
		String stringContent = "Update address for Sunny Skies " +
			    "Inc., to 10 Upbeat Street, Pleasant Grove, CA 95439";

			attachment.setContent(stringContent, "text/plain");
			attachment.setContentId("update_address");
			message.addAttachmentPart(attachment);

		String response = client.create(message);
		System.out.println("SOAP Response: " + response);
	}

Kommt folgende Exception:
Caused by: org.apache.cxf.binding.soap.SoapFault: Unmarshalling Error: Unable to create an instance of javax.xml.soap.SOAPMessage
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:75)
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:46)
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:35)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:105)
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:797)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1618)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1491)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1399)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:646)
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:533)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:463)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:366)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:319)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:88)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134)
... 36 more


Jemand eine Idee? :)
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück