Barlotta, Michael [USA] wrote:
Eoghan:
Thanks... that seems to have cleared things up...(looks like it is actually
trying to do WS-RM now)
Now I am getting the following error:
INFO: Action : http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence
Jun 27, 2008 3:59:29 PM org.apache.cxf.phase.PhaseInterceptorChain doIntercept
INFO: Interceptor has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Connection refused: connect
Sounds like an address mis-configuration.
If you're using tcpmon, ensure the client's WSDL reflects the tcpmon
listen address.
Say the server is listening on port 9000.
Add a listener in tcpmon with:
- target port 9000
- listen port 8999
- reconfigure your client to invoke on port 8999
The last step may be acheived by either changing the <soap:address> in
the client's WSDL, or by overriding the target address in code via the
BindingProvider.ENDPOINT_ADDRESS_PROPERTY.
I have the JBoss AS running with the Service, I have even setup TCPMON but the client does not seem to be able to send the WS-RM requests.
On a separate note, is there some reason why the use of the XML file was not
setting the interceptors, that is the only reason I switched over to manual
mode... :)
Original code shown below:
SpringBusFactory bf = new SpringBusFactory();
Bus bus = bf.createBus("cxf_rm_client.xml");
bf.setDefaultBus(bus);
List<Interceptor> inList = bus.getInInterceptors();
System.out.println("Num In Interceptors:"+inList.size());
// OUTPUT:
Num In Interceptors:0
Can you forward your cxf_rm_client.xml?
On another note, does CXF client automatically handle WS-RM if the WSDL has the
policy in it and the interceptors have not been added?
Asserting the policy in the WSDL /should/ result in the interceptors
being transparently added by the RM PolicyInterceptorProvider.
/Eoghan
Thanks,
Mike
-----Original Message-----
From: Eoghan Glynn [mailto:[EMAIL PROTECTED]
Sent: Fri 6/27/2008 3:01 PM
To: [email protected]
Subject: Re: WS-RM enabling in CXF
Mike,
When adding the interceptors manually, you have to be careful to ensure
that the *same* instance of each interceptor type is added to each list
.... something like:
MAPAggregator mapAggregator = new MAPAggregator();
MAPCodec mapCodec = new MAPCodec();
bus.getInInterceptors().add(mapAggregator);
bus.getInInterceptors().add(mapCodec);
bus.getOutInterceptors().add(mapAggregator);
bus.getOutInterceptors().add(mapCodec);
bus.getInFaultInterceptors().add(mapAggregator);
bus.getInFaultInterceptors().add(mapCodec);
bus.getOutFaultInterceptors().add(mapAggregator);
bus.getOutFaultInterceptors().add(mapCodec);
RMInInterceptor rmIn = new RMInInterceptor();
RMOutInterceptor rmOut = new RMOutInterceptor();
RMSoapInterceptor rmCodec = new RMSoapInterceptor();
rmIn.setBus(bus);
rmOut.setBus(bus);
bus.getInInterceptors().add(rmIn);
bus.getInInterceptors().add(rmSoap);
bus.getOutInterceptors().add(rmOut);
bus.getOutInterceptors().add(rmCodec);
bus.getInFaultInterceptors().add(rmIn);
bus.getInFaultInterceptors().add(rmCodec);
bus.getOutFaultInterceptors().add(rmOut);
bus.getOutFaultInterceptors().add(rmCodec);
Order of addition to these list shouldn't matter, as the Interceptor
phase & getBefore/getAfter() mechanisms will ensure that interceptors
are correctly ordered when a chain is assembled for an invocation.
Note the calls to setBus() on the RM interceptors, this will avoid the
NPE you're seeing:
> java.lang.NullPointerException
> at org.apache.cxf.ws.rm.AbstractRMInterceptor.getManager(
> AbstractRMInterceptor.java:56)
Finally, if you're adding the interceptors explicitly in code, you
shouldn't /also/ be asserting the RM/Adressing policies or features in
the cxf_rm_client.xml client config.
/Eoghan
Barlotta, Michael [USA] wrote:
Eoghan:
Thanks for the help, here is where I am so far...
<Quote>
You're getting these errors on the server-side right?
</Quote>
Yes.
<Quote>
Are you using WSDL-first or Java-first?
If WSDL-first, does your WSDL include the <wsam:UsingAddressing>
extension element? (see the ws_rm sample WSDL)
</Quote>
WSDL-first. I am actually using the ws-rm samples WSDL.
<Quote>
Which implies that WS-A (and possibly WS-RM also) is not being properly
enabled on the client-side.
</Quote>
Funny thing, I dumped the interceptors on the client and there are
none...
SpringBusFactory bf = new SpringBusFactory();
Bus bus = bf.createBus("cxf_rm_client.xml");
bf.setDefaultBus(bus);
List<Interceptor> inList = bus.getInInterceptors();
System.out.println("Num In Interceptors:"+inList.size());
// Num In Interceptors:0
List<Interceptor> outList = bus.getOutInterceptors();
System.out.println("Num Out Interceptors:"+outList.size());
// Num Out Interceptors:0
I added them via code as follows:
inList.add(new
org.apache.cxf.interceptor.LoggingInInterceptor());
inList.add(new
org.apache.cxf.ws.addressing.MAPAggregator());
inList.add(new
org.apache.cxf.ws.addressing.soap.MAPCodec());
inList.add(new org.apache.cxf.ws.rm.RMInInterceptor());
inList.add(new
org.apache.cxf.ws.rm.soap.RMSoapInterceptor());
outList.add(new
org.apache.cxf.interceptor.LoggingOutInterceptor());
outList.add(new
org.apache.cxf.ws.addressing.MAPAggregator());
outList.add(new
org.apache.cxf.ws.addressing.soap.MAPCodec());
outList.add(new org.apache.cxf.ws.rm.RMOutInterceptor());
outList.add(new
org.apache.cxf.ws.rm.soap.RMSoapInterceptor());
Does it matter what order I add the Interceptors?
Doing this I get the following errors (client side - there is nothing on
the server):
Jun 27, 2008 10:11:51 AM
org.apache.cxf.service.factory.ReflectionServiceFactoryBean
buildServiceFromWSDL
INFO: Creating Service
{http://cxf.apache.org/hello_world_soap_http}GreeterService from WSDL:
file:src/wsdl/hello_world_rm.wsdl
Jun 27, 2008 10:11:52 AM
org.apache.cxf.ws.addressing.ContextUtils retrieveMAPs
INFO: retrieving MAPs from context property
javax.xml.ws.addressing.context
Jun 27, 2008 10:11:52 AM
org.apache.cxf.ws.addressing.MAPAggregator getMAPs
INFO: MAPs retrieved from message null
Jun 27, 2008 10:11:52 AM
org.apache.cxf.ws.addressing.ContextUtils storeMAPs
INFO: associating MAPs with context property
javax.xml.ws.addressing.context.outbound
Jun 27, 2008 10:11:52 AM
org.apache.cxf.ws.addressing.ContextUtils retrieveMAPs
INFO: retrieving MAPs from context property
javax.xml.ws.addressing.context.outbound
Jun 27, 2008 10:11:52 AM
org.apache.cxf.ws.addressing.ContextUtils retrieveMAPs
INFO: current MAPs [MessageId:
urn:uuid:9ab9a836-ccf9-4bd0-b0b1-1d6c9b73f01c, Action:
http://cxf.apache.org/hello_world_soap_http/Greeter/sayHiRequest, To:
http://localhost:9000/SoapContext/GreeterPort, ReplyTo:
http://www.w3.org/2005/08/addressing/anonymous, FaultTo:
http://www.w3.org/2005/08/addressing/anonymous]
Jun 27, 2008 10:11:52 AM
org.apache.cxf.ws.addressing.ContextUtils retrieveMAPs
INFO: retrieving MAPs from context property
javax.xml.ws.addressing.context.outbound
Jun 27, 2008 10:11:52 AM
org.apache.cxf.ws.addressing.ContextUtils retrieveMAPs
INFO: current MAPs [MessageId:
urn:uuid:9ab9a836-ccf9-4bd0-b0b1-1d6c9b73f01c, Action:
http://cxf.apache.org/hello_world_soap_http/Greeter/sayHiRequest, To:
http://localhost:9000/SoapContext/GreeterPort, ReplyTo:
http://www.w3.org/2005/08/addressing/anonymous, FaultTo:
http://www.w3.org/2005/08/addressing/anonymous]
Jun 27, 2008 10:11:52 AM
org.apache.cxf.phase.PhaseInterceptorChain doIntercept
INFO: Interceptor has thrown exception, unwinding now
java.lang.NullPointerException
at
org.apache.cxf.ws.rm.AbstractRMInterceptor.getManager(AbstractRMIntercep
tor.java:56)
Any ideas on what causes this error?
Right now I am using the CXF logging to look for the WS-A and WS-RM
elements in the SOAP to verify that all is working. I have used TCPMON
in the past and will try that too.
PS: sorry for the double post...
Mike Barlotta
Associate
Booz | Allen | Hamilton
-----Original Message-----
From: Eoghan Glynn [mailto:[EMAIL PROTECTED]
Sent: Friday, June 27, 2008 5:50 AM
To: [email protected]
Subject: Re: WS-RM enabling in CXF
Barlotta, Michael [USA] wrote:
After digging and playing there are at least two options (there may be
more) to configure WS-RM
1) adding interceptors to the CXF bus
2) adding policy to the endpoint
I have not gotten very far with option 1, though I am not sure why.
The Greeter service from the samples ws-rm directory works, but no
addressing/reliable messaging calls are taking place.
I have switched to using WS-Policy. (attached is the server side
Spring context file).
I still get the addressing errors...
16:13:59,096 ERROR [STDERR] Jun 26, 2008 4:13:59 PM
org.apache.cxf.ws.addressing.ContextUtils retrieveMAPs
WARNING: WS-Addressing - failed to retrieve Message Addressing
Properties from context
I also get this error:
16:13:59,346 ERROR [STDERR] Jun 26, 2008 4:13:59 PM
org.apache.cxf.phase.PhaseInterceptorChain doIntercept
INFO: Interceptor has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: None of the policy alternatives can
be satisfied.
at
org.apache.cxf.ws.policy.AbstractPolicyInterceptor.handleMessage(Abstr
ac
tPolicyInterceptor.java:58)
Mike,
You're getting these errors on the server-side right?
This implies that WS-A is indeed enabled on the server-side, but the
headers that WS-A expects are missing from the incoming request payload.
Which implies that WS-A (and possibly WS-RM also) is not being properly
enabled on the client-side.
You can confirm this by interposing tcpmon between client and server so
as to inspect the payload. Details on how to do this were discussed on
these lists recently[1]. Or can you just look at the server-side logging
output, if the <cxf:logging/> feature is set on the endpoint. You'll be
looking for WS-A elements in the <soap:Header>, such as <MessageID> and
<ReplyTo>, also for WS-RM elements such as <wsrm:Sequence>.
Assuming it turns out that the WS-A/RM headers are indeed missing from
the client's request payload, the next step is to figure out why.
Are you using WSDL-first or Java-first?
If WSDL-first, does your WSDL include the <wsam:UsingAddressing>
extension element? (see the ws_rm sample WSDL)
If Java-first, try enabling WS-A by setting the <wsam:Addressing>
policy, *OR* the CXF <wsa:addressing> feature, on the <jaxws:client>
bean in the client config (instead of manually adding the interceptors
to the Bus-level chains).
Cheers,
Eoghan
[1] http://www.nabble.com/View-SOAP-Messages-to17812716.html#a17820449
Similar to this JIRA issue: (though I did not add the policy to the
WSDL, I am using the one supplied in the samples directory of CXF)
http://issues.apache.org/jira/browse/CXF-1311
This is what the client looks like: the client Spring file is similar
to the one posted earliar (interceptors attached to the bus).
SpringBusFactory bf = new SpringBusFactory();
Bus bus = bf.createBus("cxf_rm_client.xml");
bf.setDefaultBus(bus);
GreeterService service = new GreeterService();
Greeter port = service.getGreeterPort();
// Use Proxy Instance as BindingProvider
BindingProvider bp = (BindingProvider) port;
// enable MTOM
SOAPBinding binding = (SOAPBinding)bp.getBinding();
binding.setMTOMEnabled(false);
// (Optional) Configure RequestContext with endpoint's
URL
Map<String, Object> rc = bp.getRequestContext();
rc.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
SERVICE_ADDRESS);
rc.put(SOAPBinding.SOAP12HTTP_BINDING,true);
String response = port.sayHi();
Thanks,
Mike Barlotta
Associate
Booz | Allen | Hamilton
----------------------------
IONA Technologies PLC (registered in Ireland)
Registered Number: 171387
Registered Address: The IONA Building, Shelbourne Road, Dublin 4, Ireland
----------------------------
IONA Technologies PLC (registered in Ireland)
Registered Number: 171387
Registered Address: The IONA Building, Shelbourne Road, Dublin 4, Ireland