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:
WSDL:
[XML]<?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
art name="parameters" element="tns:createResponse">
</wsdl
art>
</wsdl:message>
<wsdl:message name="create">
<wsdl
art name="parameters" element="tns:create">
</wsdl
art>
</wsdl:message>
<wsdl
ortType name="EndPoint">
<wsdl
peration name="create">
<wsdl:input name="create" message="tns:create">
</wsdl:input>
<wsdl
utput name="createResponse" message="tns:createResponse">
</wsdl
utput>
</wsdl
peration>
</wsdl
ortType>
<wsdl:binding name="WebServiceServiceSoapBinding" type="tns:EndPoint">
<soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl
peration name="create">
<soap12
peration soapAction="urn:Create" style="document"/>
<wsdl:input name="create">
<soap12:body use="literal"/>
</wsdl:input>
<wsdl
utput name="createResponse">
<soap12:body use="literal"/>
</wsdl
utput>
</wsdl
peration>
</wsdl:binding>
<wsdl:service name="WebServiceService">
<wsdl
ort name="WebServicePort" binding="tns:WebServiceServiceSoapBinding">
<soap12:address location="http://localhost:8080/WebServiceSOAP/services/WebServicePort"/>
</wsdl
ort>
</wsdl:service>
</wsdl:definitions>[/XML]
XSD:
[XML]<?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>[/XML]
Endpoint:
CLient:
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(Soap11FaultInInterce ptor.java:75)
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInIntercep tor.java:46)
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInIntercep tor.java:35)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiator Observer.java:105)
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.ja va:69)
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.ja va: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.jav a: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(Mes sageSenderInterceptor.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?
Webservice:
Java:
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:
[XML]<?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
</wsdl
</wsdl:message>
<wsdl:message name="create">
<wsdl
</wsdl
</wsdl:message>
<wsdl
<wsdl
<wsdl:input name="create" message="tns:create">
</wsdl:input>
<wsdl
</wsdl
</wsdl
</wsdl
<wsdl:binding name="WebServiceServiceSoapBinding" type="tns:EndPoint">
<soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl
<soap12
<wsdl:input name="create">
<soap12:body use="literal"/>
</wsdl:input>
<wsdl
<soap12:body use="literal"/>
</wsdl
</wsdl
</wsdl:binding>
<wsdl:service name="WebServiceService">
<wsdl
<soap12:address location="http://localhost:8080/WebServiceSOAP/services/WebServicePort"/>
</wsdl
</wsdl:service>
</wsdl:definitions>[/XML]
XSD:
[XML]<?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>[/XML]
Endpoint:
Java:
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:
Java:
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(Soap11FaultInInterce ptor.java:75)
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInIntercep tor.java:46)
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInIntercep tor.java:35)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiator Observer.java:105)
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.ja va:69)
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.ja va: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.jav a: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(Mes sageSenderInterceptor.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?