There is a problem when i post the "param" tag : it does not appear in
the
forum post. I edited my previous message and put some spaces :
<tns:getProtoDTO>
< param>myparam</ param>
</tns:getProtoDTO>
Sorry, i didn't notice it in my first post. I think the
misunderstanding
came from that...
Best Regards,
Florent
Florent wrote:
Ok, i think i understand why you said my soap enveloppe in incorrect.
Here is the one i'm using (in my first post, i have to admit it wasn't
correct) :
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
xmlns:tns=\"http://ejb.proto.sopra.com\">
<env:Body>
<tns:getProtoDTO>
< param>myparam</ param>
</tns:getProtoDTO>
</env:Body>
</env:Envelope>
Florent wrote:
this :
Standalone client <--> SOAP message <--> Servicemix cxf bc
consumer<--->
JBI message <--->Servicemix Cxf bc provider <---> soap message
<-->Websphere
Application Server
is exactly what i want to be done (and what i'm trying to do) :)
According to your reply, i should use the following soap message :
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
xmlns:tns=\"http://ejb.proto.sopra.com\">
<env:Body>
<tns:getProtoDTO>
<date>2007-11-27T10:04:16.347Z</date>
<dble>0.0</dble>
<integ>1</integ>
<liste>
<string>s01</string><string>s02</string><string>s03</string>
</liste>
</tns:getProtoDTO>
</env:Body>
</env:Envelope>
But, according to my wsdl, this is the response soap message, not the
request one !
Operation :
<wsdl:operation name="getProtoDTO">
<wsdlsoap:operation soapAction="getProtoDTO"/>
<wsdl:input name="getProtoDTORequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getProtoDTOResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
PortType :
<wsdl:portType name="ProtoBean">
<wsdl:operation name="getProtoDTO">
<wsdl:input message="intf:getProtoDTORequest"
name="getProtoDTORequest"/>
<wsdl:output message="intf:getProtoDTOResponse"
name="getProtoDTOResponse"/>
</wsdl:operation>
</wsdl:portType>
Input / request :
<wsdl:message name="getProtoDTORequest">
<wsdl:part element="intf:getProtoDTO" name="parameters"/>
</wsdl:message>
Element :
<element name="getProtoDTO">
<complexType>
<sequence>
<element name="param" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
</element>
Output / response :
<wsdl:message name="getProtoDTOResponse">
<wsdl:part element="intf:getProtoDTOResponse"
name="parameters"/>
</wsdl:message>
Element :
<element name="getProtoDTOResponse">
<complexType>
<sequence>
<element name="getProtoDTOReturn" nillable="true"
type="tns2:ProtoDTO"/>
</sequence>
</complexType>
</element>
So, the output is the ProtoDTO complex type, and the input is a
string.
Did i misunderstand something? May be i'm confusing provider/consumer
role?
Freeman Fang wrote:
Comments in line
Florent wrote:
Morning Freeman,
I tried to modify my SOAP message, but it didn't work : i still get
the
same
error.
What's your new soap message now?
I also tried to call the web service with this enveloppe and a
standalone
client : i got a "wrong parameter error".
I think my SOAP message is correct : i tried to generate it from
the
RAD 7
web service test and it was the same one. Plus, my business method
has
one
parameter (a string) and a complex type as return type.
According to the schema from your wsdl, your soap messge
<getProtoDTO>ddd</getProteDTO> is not correct, under <getProtoDTO>
element, there should be element <date> or <dble> or <integ> or
<liste>
Btw, different soap tool kit may generate soap message with little
different, which may cause interoperability problem
As i'm totally new to servicemix, so there is probably something i
don't
understand.
What i want to do :
SOAP message <--> Servicemix cxf bc <---> SOAP message
<-->Websphere
Application Server
Considering the debug log, what i think it's going on :
SOAP message <--> Servicemix cxf bc <---> JBI message <-->Websphere
Application Server
no, what's going on is
SOAP message <--> Servicemix cxf bc consumer<---> JBI message
<--->Servicemix Cxf bc provider <---> soap message <-->Websphere
Application Server
So what's reach your websphere application server is soap message,
not
jbi message.
May be you need refer to [1] which is similiar as your scenario
[1]
http://svn.apache.org/repos/asf/servicemix/trunk/deployables/bindingcomponents/servicemix-cxf-bc/src/test/java/org/apache/servicemix/cxfbc/CxfBcProviderConsumerTest.java
So, i don't think WAS support JBI message... and that could explain
my
error
(i no longer think it's a soap verion problem).
http://localhost:9080/PROTOServiceMixWeb/services/ProtoBean = thrid
party
web service URL.
http://localhost:8092/ProtoBeanService/ = servicemix web service.
I only want to call my web service, but i want to call it using a
servicemix
URL.
Thanks again for your help,
Best Regards,
Florent.
Freeman Fang wrote:
Hi Florent,
This problem has nothing to do with soap version.
The problem is that your hard code soap request message is not
correct.
According to the schema in wsdl you append, it should be something
like
<env:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:en
v="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/
XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tns="http
://ejb.proto.mycompany.com"><env:Body><tns:getProtoDTO>
<date>your date</date>
<dble>your dble</dble>
<integ>your integ</integ>
<liste>your liste</liste>
</tns:getPr
otoDTO></env:Body></env:Envelope>
You shouldn't use
<tns:getProtoDTO>something</tns:getProtoDTO> directly without
element
tag
defined in the schema.
For some complex schema, write soap message yourself is not so
easy,
so we
prefer to use some soap tool kit to generate soap message for you,
may
be
you can try to use apache cxf, basically generate code stub from
the
wsdl, and what you need do is just write client invoke code as
normal
java
operation invoke and cxf will genearate soap message for you.
Would you please try it again?
Best Regards
Freeman
Florent wrote:
Hi Freeman,
Indeed,
http://localhost:9080/PROTOServiceMixWeb/services/ProtoBean
use
soap
1.1.
But i don't know which soap version
http://localhost:8092/ProtoBeanService/
is using...
The third party webservice is hosted by Websphere Application
Server
6.1.
I don't really know what cxf is doing to the message, is it
possible
to
log/trace it?
I enabled debug log and added interceptors in my xbean.xml, here
is
the
output :
INFO: Inbound Message
--------------------------------------
Encoding: utf-8
Headers: {Content-Length=[353], User-Agent=[IBM WebServices/1.0],
Host=[ITEM-509
73:8092], connection=[Keep-Alive], Date=[Mon, 26 Nov 2007
08:59:47
GMT],
SOAPAct
ion=[], Pragma=[no-cache], content-type=[text/xml;
charset=utf-8],
Cache-Control
=[no-cache],
Accept=[application/soap+xml,multipart/related,text/*]}
Message:
<env:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:en
v="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/
XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tns="http
://ejb.proto.mycompany.com"><env:Body><tns:getProtoDTO>ddd</tns:getPr
otoDTO></env:Body></env:Envelope>
--------------------------------------
DEBUG - CxfBcComponent - Created correlation id:
ID:172.16.180.193-1167b1f58b2-4:1
DEBUG - DeliveryChannelImpl - SendSync
ID:172.16.180.193-1167b1f58b2-4:1 in
DeliveryChannel{servicemix-cxf-bc}
DEBUG - SedaFlow - Called Flow send
DEBUG - DeliveryChannelImpl - Waiting for exchange
ID:172.16.180.193-1167b1f58b2-4:1 (1d7a7b3) to be answered in
DeliveryChannel{servicemix-cxf-bc} from sendSync
DEBUG - SedaQueue -
[EMAIL PROTECTED]
dequeued
exchange: InOut[
id: ID:172.16.180.193-1167b1f58b2-4:1
status: Active
role: provider
interface: {http://ejb.proto.mycompany.com}ProtoBean
service: {http://ejb.proto.mycompany.com}ProtoBeanService
endpoint: ProtoBean
operation: {http://ejb.proto.mycompany.com}getProtoDTO
in: <?xml version="1.0" encoding="UTF-8"?><jbi:message
xmlns:jbi="http://java.
sun.com/xml/ns/jbi/wsdl-11-wrapper"
xmlns:msg="http://ejb.proto.mycompany.com" name=
"getProtoDTORequest" type="msg:getProtoDTORequest"
version="1.0"><jbi:part><tns:
getProtoDTO
xmlns:tns="http://ejb.proto.mycompany.com">ddd</tns:getPr
otoDTO></jbi:part></jbi:message>
]
DEBUG - CxfBcComponent - Received exchange:
status:
Active,
role: provider
DEBUG - CxfBcComponent - Retrieved correlation
id:
ID:172.16.180.193-1167b1f58b2-4:1
DEBUG - DeliveryChannelImpl - Send
ID:172.16.180.193-1167b1f58b2-4:1in
DeliveryChannel{servicemix-cxf-bc}
DEBUG - SedaFlow - Called Flow send
DEBUG - SedaQueue -
[EMAIL PROTECTED]
dequeued
exchange: InOut[
id: ID:172.16.180.193-1167b1f58b2-4:1
status: Active
role: consumer
interface: {http://ejb.proto.mycompany.com}ProtoBean
service: {http://ejb.proto.mycompany.com}ProtoBeanService
endpoint: ProtoBean
operation: {http://ejb.proto.mycompany.com}getProtoDTO
in: <?xml version="1.0" encoding="UTF-8"?><jbi:message
xmlns:jbi="http://java.
sun.com/xml/ns/jbi/wsdl-11-wrapper"
xmlns:msg="http://ejb.proto.mycompany.com" name=
"getProtoDTORequest" type="msg:getProtoDTORequest"
version="1.0"><jbi:part><tns:
getProtoDTO
xmlns:tns="http://ejb.proto.mycompany.com">ddd</tns:getPr
otoDTO></jbi:part></jbi:message>
out: null
]
DEBUG - DeliveryChannelImpl - Notifying exchange
ID:172.16.180.193-1167b1f58b2-4:1(1d7a7b3) in
DeliveryChannel{servicemix-cxf-bc} from
processInboundSynchronousExchange
DEBUG - DeliveryChannelImpl - Notified:
ID:172.16.180.193-1167b1f58b2-4:1(1d7a7b3) in
DeliveryChannel{servicemix-cxf-bc} from sendSync
26 nov. 2007 09:59:48
org.apache.cxf.interceptor.LoggingOutInterceptor$LoggingCallback
onClose
INFO: Outbound Message
--------------------------------------
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body
/></soap:Envelope>
--------------------------------------
DEBUG - DeliveryChannelImpl - Send
ID:172.16.180.193-1167b1f58b2-4:1
in DeliveryChannel{servicemix-cxf-bc}
DEBUG - SedaFlow - Called Flow send
DEBUG - SedaQueue -
[EMAIL PROTECTED]
dequeued
exchange: InOut[
id: ID:172.16.180.193-1167b1f58b2-4:1
status: Done
role: provider
interface: {http://ejb.proto.mycompany.com}ProtoBean
service: {http://ejb.proto.mycompany.com}ProtoBeanService
endpoint: ProtoBean
operation: {http://ejb.proto.mycompany.com}getProtoDTO
in: <?xml version="1.0" encoding="UTF-8"?><jbi:message
xmlns:jbi="http://java.
sun.com/xml/ns/jbi/wsdl-11-wrapper"
xmlns:msg="http://ejb.proto.mycompany.com" name=
"getProtoDTORequest" type="msg:getProtoDTORequest"
version="1.0"><jbi:part><tns:
getProtoDTO
xmlns:tns="http://ejb.proto.mycompany.com">ddd</tns:getPr
otoDTO></jbi:part></jbi:message>
out: null
]
DEBUG - CxfBcComponent - Received exchange:
status:
Done,
role:provider
DEBUG - CxfBcComponent - Retrieved correlation
id:
ID:172.16.180.193-1167b1f58b2-4:1
javax.jbi.messaging.MessagingException: Out not supported
at
org.apache.servicemix.jbi.messaging.MessageExchangeImpl.setMessage(MessageExchangeImpl.java:357)
at
org.apache.servicemix.cxfbc.CxfBcProviderMessageObserver.onMessage(CxfBcProviderMessageObserver.java:125)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1932)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1790)
at
org.apache.servicemix.cxfbc.CxfBcProvider.process(CxfBcProvider.java:166)
at
org.apache.servicemix.common.AsyncBaseLifeCycle.doProcess(AsyncBaseLifeCycle.java:538)
at
org.apache.servicemix.common.AsyncBaseLifeCycle.processExchange(AsyncBaseLifeCycle.java:490)
at
org.apache.servicemix.common.BaseLifeCycle.onMessageExchange(BaseLifeCycle.java:46)
at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.processInBound(DeliveryChannelImpl.java:610)
at
org.apache.servicemix.jbi.nmr.flow.AbstractFlow.doRouting(AbstractFlow.java:170)
at
org.apache.servicemix.jbi.nmr.flow.seda.SedaFlow.doRouting(SedaFlow.java:167)
at
org.apache.servicemix.jbi.nmr.flow.seda.SedaQueue$1.run(SedaQueue.java:134)
at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
at java.lang.Thread.run(Thread.java:595)
Here is my wsdl used by servicemix (the one used by the AS is the
same
one,
except the service location) :
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
targetNamespace="http://ejb.proto.mycompany.com"
xmlns:impl="http://ejb.proto.mycompany.com"
xmlns:intf="http://ejb.proto.mycompany.com"
xmlns:tns2="http://dto.proto.mycompany.com"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsi="http://ws-i.org/profiles/basic/1.1/xsd"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<schema targetNamespace="http://ejb.proto.mycompany.com"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns2="http://dto.proto.mycompany.com"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<import
namespace="http://dto.proto.mycompany.com" />
<element name="getProtoDTOResponse">
<complexType>
<sequence>
<element
name="getProtoDTOReturn"
nillable="true"
type="tns2:ProtoDTO" />
</sequence>
</complexType>
</element>
<element name="getProtoDTO">
<complexType>
<sequence>
<element name="param"
nillable="true"
type="xsd:string"
/>
</sequence>
</complexType>
</element>
<complexType name="ArrayOf_xsd_nillable_string">
<sequence>
<element maxOccurs="unbounded"
minOccurs="0"
name="string"
nillable="true" type="xsd:string" />
</sequence>
</complexType>
</schema>
<schema targetNamespace="http://dto.proto.mycompany.com"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:intf="http://ejb.proto.mycompany.com"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<import
namespace="http://ejb.proto.mycompany.com" />
<complexType name="ProtoDTO">
<sequence>
<element name="date"
nillable="true"
type="xsd:dateTime" />
<element name="dble"
nillable="true"
type="xsd:double" />
<element name="integ"
type="xsd:int" />
<element name="liste"
nillable="true"
type="impl:ArrayOf_xsd_nillable_string" />
</sequence>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="getProtoDTORequest">
<wsdl:part element="intf:getProtoDTO" name="parameters"
/>
</wsdl:message>
<wsdl:message name="getProtoDTOResponse">
<wsdl:part element="intf:getProtoDTOResponse"
name="parameters" />
</wsdl:message>
<wsdl:portType name="ProtoBean">
<wsdl:operation name="getProtoDTO">
<wsdl:input message="intf:getProtoDTORequest"
name="getProtoDTORequest" />
<wsdl:output message="intf:getProtoDTOResponse"
name="getProtoDTOResponse" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ProtoBeanSoapBinding" type="intf:ProtoBean">
<wsdlsoap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"
/>
<wsdl:operation name="getProtoDTO">
<wsdlsoap:operation soapAction="getProtoDTO" />
<wsdl:input name="getProtoDTORequest">
<wsdlsoap:body use="literal" />
</wsdl:input>
<wsdl:output name="getProtoDTOResponse">
<wsdlsoap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ProtoBeanService">
<wsdl:port binding="intf:ProtoBeanSoapBinding"
name="ProtoBean">
<wsdlsoap:address
location="http://localhost:8092/ProtoBeanService/" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Thanks in advance,
Florent.
Freeman Fang-2 wrote:
Hi Florent,
Do you mean
http://localhost:9080/PROTOServiceMixWeb/services/ProtoBean
use
soap1.1 and http://localhost:8092/ProtoBeanService/ use soap
1.2?
Which soap toolkit are the third party webservice using?
Would you please append the wsdl used for two webservices?
Best Regards
Freeman
Florent wrote:
If i use the following code to access to my web service, it
works
fine
:
String endpoint =
"http://localhost:9080/PROTOServiceMixWeb/services/ProtoBean";
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<env:Envelope
xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\"
" +
"xmlns:tns=\"http://ejb.proto.mycompany.com\">" +
"<env:Body>" +
"<tns:getProtoDTO>" +
"<tns:getProtoDTORequest>0</tns:getProtoDTORequest>" +
"</tns:getProtoDTO>" +
"</env:Body>" +
"</env:Envelope>";
MessageFactory mf =
MessageFactory.newInstance();
SOAPMessage smsg = mf.createMessage(new
MimeHeaders(), new
ByteArrayInputStream(xml.getBytes()));
SOAPConnection conn =
SOAPConnectionFactory.newInstance().createConnection();
SOAPMessage response = conn.call(smsg, url);
SOAPEnvelope env =
response.getSOAPPart().getEnvelope();
If i try to call the fellowing url :
http://localhost:8092/ProtoBeanService/
i get an error : No SOAPAction header (Application server
log)...
That's
why
i was wondering about the soap version.
I get the following error in servicemix log :
javax.jbi.messaging.MessagingException: Out not supported
at
org.apache.servicemix.jbi.messaging.MessageExchangeImpl.setMessage(MessageExchangeImpl.java:357)
at
org.apache.servicemix.cxfbc.CxfBcProviderMessageObserver.onMessage(CxfBcProviderMessageObserver.java:125)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1932)
at
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1790)
at
org.apache.servicemix.cxfbc.CxfBcProvider.process(CxfBcProvider.java:166)
at
org.apache.servicemix.common.AsyncBaseLifeCycle.doProcess(AsyncBaseLifeCycle.java:538)
at
org.apache.servicemix.common.AsyncBaseLifeCycle.processExchange(AsyncBaseLifeCycle.java:490)
at
org.apache.servicemix.common.BaseLifeCycle.onMessageExchange(BaseLifeCycle.java:46)
at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.processInBound(DeliveryChannelImpl.java:610)
at
org.apache.servicemix.jbi.nmr.flow.AbstractFlow.doRouting(AbstractFlow.java:170)
at
org.apache.servicemix.jbi.nmr.flow.seda.SedaFlow.doRouting(SedaFlow.java:167)
at
org.apache.servicemix.jbi.nmr.flow.seda.SedaQueue$1.run(SedaQueue.java:134)
at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
at java.lang.Thread.run(Thread.java:595)
Any idea?
Thank you in advance,
Florent.
Freeman Fang wrote:
Hi,
You needn't specify it in cxf bc endpint configuration. Cxf bc
should
support both of it by default.
Cxf bc will parse the wsdl you provided and create service
model
accordingly, extract soap version from your wsdl binding part.
Best Regards
Freeman
Florent wrote:
Hello,
I'm trying to expose a third party webservice to the bus,
using
cxf.
I'd like to know if i can set the soap version. For example,
when
i
was
using service-http, there was a SoapVersion attribute, but i
didn't
find
one
for the servicemix-cxf-bc-3.2-schema.
Is soap 1.1 or 1.2 used?
Here is my xbean.xml :
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:cxfbc="http://servicemix.apache.org/cxfbc/1.0"
xmlns:ns1="http://ejb.proto.mycompany.com">
<cxfbc:consumer
wsdl="classpath:ProtoBean.wsdl"
endpoint="ProtoBeanPort"
targetEndpoint="ProtoBean"
targetService="ns1:ProtoBeanService"
targetInterface="ns1:ProtoBean"
>
</cxfbc:consumer>
<cxfbc:provider
wsdl="classpath:ProtoBean.wsdl"
locationURI="http://localhost:9080/PROTOServiceMixWeb/services/ProtoBean"
service="ns1:ProtoBeanService"
endpoint="ProtoBean"
interfaceName="ns1:ProtoBean"
>
</cxfbc:provider>
</beans>
--
View this message in context:
http://www.nabble.com/servicemix-cxf-bc---soapVersion-attribute-tf4860627s12049.html#a13969473
Sent from the ServiceMix - User mailing list archive at Nabble.com.