Thanks for the help Dan. That moved things a little ahead. I was able to
add the interceptors - but did not know what phase string I need to have
them return. So I debugged the flow in CXF code that is throwing the error
- and it seems:
1. the policy in the wsdl has many elements indicated as options
(wsp:Optional=true). But the code in PolicyEngineImpl.supportsAlternative
seems to be ignoring that setting - it checks only for the variable named
optional, not the wsp:Optional="true" value
2. From the reason the error is thrown, it seems that if I provide a
supported alternative (Assertor?), the error will not get thrown I.e.
Things may work. But the forum post
http://comments.gmane.org/gmane.comp.apache.cxf.user/21774 from an earlier
user talks about defining AssertionBuilders and
PolicyInterceptorProviders. And my use case seems exactly same as that
described in this post. So do I need to define an alternative selector or
do I need AssertionBuilders / PolicyInterceptorProviders?
3. Further, the endpoint does not really seem to be enforcing these
policies - if I edit the wsdl to remome the policies and use the edited
wsdl in my dispatch client call, everything works and I do get the data
from the svc. But when I use the wsdl with the policies, I get:
Feb 12, 2013 11:00:59 PM
org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl
handleNoRegisteredBuilder
WARNING: No assertion builder for type
{http://www.sap.com/webas/710/soap/features/transportbinding/}OptimizedXMLT
ransfer registered.
Feb 12, 2013 11:00:59 PM
org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl
handleNoRegisteredBuilder
WARNING: No assertion builder for type
{http://www.sap.com/webas/630/soap/features/session/}Session registered.
Feb 12, 2013 11:00:59 PM
org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl
handleNoRegisteredBuilder
WARNING: No assertion builder for type
{http://www.sap.com/webas/700/soap/features/CentralAdministration/}CentralA
dministration registered.
Feb 12, 2013 11:00:59 PM
org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl
handleNoRegisteredBuilder
WARNING: No assertion builder for type
{http://www.sap.com/NW05/soap/features/commit/}enableCommit registered.
Feb 12, 2013 11:00:59 PM
org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl
handleNoRegisteredBuilder
WARNING: No assertion builder for type
{http://www.sap.com/NW05/soap/features/blocking/}enableBlocking registered.
Feb 12, 2013 11:00:59 PM
org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl
handleNoRegisteredBuilder
WARNING: No assertion builder for type
{http://www.sap.com/NW05/soap/features/transaction/}required registered.
Feb 12, 2013 11:00:59 PM
org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl
handleNoRegisteredBuilder
WARNING: No assertion builder for type
{http://www.sap.com/NW05/soap/features/wsrm/}enableWSRM registered.
javax.xml.ws.soap.SOAPFaultException: None of the policy alternatives can
be satisfied.
at org.apache.cxf.jaxws.DispatchImpl.mapException(DispatchImpl.java:285)
at org.apache.cxf.jaxws.DispatchImpl.invoke(DispatchImpl.java:388)
at org.apache.cxf.jaxws.DispatchImpl.invoke(DispatchImpl.java:241)
at SoapCaller.send(SoapCaller.java:188)
at SoapCaller.send(SoapCaller.java:184)
at SAPPollerAdapter.main(SAPPollerAdapter.java:70)
Caused by: org.apache.cxf.ws.policy.PolicyException: None of the policy
alternatives can be satisfied.
at
org.apache.cxf.ws.policy.EndpointPolicyImpl.chooseAlternative(EndpointPolic
yImpl.java:165)
at
org.apache.cxf.ws.policy.EndpointPolicyImpl.finalizeConfig(EndpointPolicyIm
pl.java:145)
at
org.apache.cxf.ws.policy.EndpointPolicyImpl.initialize(EndpointPolicyImpl.j
ava:141)
at
org.apache.cxf.ws.policy.PolicyEngineImpl.createEndpointPolicyInfo(PolicyEn
gineImpl.java:555)
at
org.apache.cxf.ws.policy.PolicyEngineImpl.getEndpointPolicy(PolicyEngineImp
l.java:301)
at
org.apache.cxf.ws.policy.PolicyEngineImpl.getClientEndpointPolicy(PolicyEng
ineImpl.java:283)
at
org.apache.cxf.transport.http.policy.PolicyUtils.getClient(PolicyUtils.java
:150)
at org.apache.cxf.transport.http.HTTPConduit.<init>(HTTPConduit.java:308)
at
org.apache.cxf.transport.http.HTTPTransportFactory.getConduit(HTTPTransport
Factory.java:248)
at
org.apache.cxf.binding.soap.SoapTransportFactory.getConduit(SoapTransportFa
ctory.java:229)
at
org.apache.cxf.binding.soap.SoapTransportFactory.getConduit(SoapTransportFa
ctory.java:236)
at
org.apache.cxf.endpoint.AbstractConduitSelector.getSelectedConduit(Abstract
ConduitSelector.java:88)
at
org.apache.cxf.endpoint.UpfrontConduitSelector.prepare(UpfrontConduitSelect
or.java:61)
at
org.apache.cxf.endpoint.ClientImpl.prepareConduitSelector(ClientImpl.java:8
43)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:526)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:461)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:364)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:317)
at org.apache.cxf.endpoint.ClientImpl.invokeWrapped(ClientImpl.java:352)
at org.apache.cxf.jaxws.DispatchImpl.invoke(DispatchImpl.java:381)
... 4 more
FYI here is the policy part of the endpoint wsdl:
<wsp:UsingPolicy wsdl:required="true" />
<wsp:Policy wsu:Id="BN_BN_binding">
<saptrnbnd:OptimizedXMLTransfer
uri="http://xml.sap.com/2006/11/esi/esp/binxml"
xmlns:saptrnbnd="http://www.sap.com/webas/710/soap/features/transportbindin
g/"
wsp:Optional="true" />
<saptrnbnd:OptimizedMimeSerialization
xmlns:saptrnbnd="http://schemas.xmlsoap.org/ws/2004/09/policy/optimizedm
imeserialization"
wsp:Optional="true" />
<wsp:ExactlyOne
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
<wsp:All>
<sp:TransportBinding
xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
xmlns:sapsp="http://www.sap.com/webas/630/soap/features/security/polic
y"
xmlns:wsa="http://www.w3.org/2005/08/addressing"
xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512"
xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility"
xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex">
<wsp:Policy>
<sp:TransportToken>
<wsp:Policy>
<sp:HttpsToken>
<wsp:Policy>
<sp:HttpBasicAuthentication />
</wsp:Policy>
</sp:HttpsToken>
</wsp:Policy>
</sp:TransportToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic128Rsa15 />
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:Layout>
<wsp:Policy>
<sp:Strict />
</wsp:Policy>
</sp:Layout>
</wsp:Policy>
</sp:TransportBinding>
</wsp:All>
<wsp:All>
<sp:TransportBinding
xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
xmlns:sapsp="http://www.sap.com/webas/630/soap/features/security/polic
y"
xmlns:wsa="http://www.w3.org/2005/08/addressing"
xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512"
xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility"
xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex">
<wsp:Policy>
<sp:TransportToken>
<wsp:Policy>
<sp:HttpsToken>
<wsp:Policy>
<sp:RequireClientCertificate />
</wsp:Policy>
</sp:HttpsToken>
</wsp:Policy>
</sp:TransportToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic128Rsa15 />
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:Layout>
<wsp:Policy>
<sp:Strict />
</wsp:Policy>
</sp:Layout>
</wsp:Policy>
</sp:TransportBinding>
</wsp:All>
<wsp:All>
<sp:TransportBinding
xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702"
xmlns:sapsp="http://www.sap.com/webas/630/soap/features/security/polic
y"
xmlns:wsa="http://www.w3.org/2005/08/addressing"
xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512"
xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility"
xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex">
<wsp:Policy>
<sp:TransportToken>
<wsp:Policy>
<sp:HttpsToken>
<wsp:Policy>
<sapsp:HTTPSSO2 />
</wsp:Policy>
</sp:HttpsToken>
</wsp:Policy>
</sp:TransportToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic128Rsa15 />
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:Layout>
<wsp:Policy>
<sp:Strict />
</wsp:Policy>
</sp:Layout>
</wsp:Policy>
</sp:TransportBinding>
</wsp:All>
</wsp:ExactlyOne>
<wsaw:UsingAddressing
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
wsp:Optional="true" />
</wsp:Policy>
<wsp:Policy wsu:Id="IF_IF_QueryLeadIn">
<sapsession:Session
xmlns:sapsession="http://www.sap.com/webas/630/soap/features/session/">
<sapsession:enableSession>false</sapsession:enableSession>
</sapsession:Session>
<sapcentraladmin:CentralAdministration
xmlns:sapcentraladmin="http://www.sap.com/webas/700/soap/features/Centra
lAdministration/"
wsp:Optional="true">
<sapcentraladmin:BusinessApplicationID>00163E0327EB1EE1B9A728D061073881
</sapcentraladmin:BusinessApplicationID>
</sapcentraladmin:CentralAdministration>
</wsp:Policy>
<wsp:Policy wsu:Id="OP_IF_OP_FindByElements">
<sapcomhnd:enableCommit
xmlns:sapcomhnd="http://www.sap.com/NW05/soap/features/commit/">false</s
apcomhnd:enableCommit>
<sapblock:enableBlocking
xmlns:sapblock="http://www.sap.com/NW05/soap/features/blocking/">true</s
apblock:enableBlocking>
<saptrhnw05:required
xmlns:saptrhnw05="http://www.sap.com/NW05/soap/features/transaction/">no
</saptrhnw05:required>
<saprmnw05:enableWSRM
xmlns:saprmnw05="http://www.sap.com/NW05/soap/features/wsrm/">false
</saprmnw05:enableWSRM>
</wsp:Policy>
Thanks,
Vish.
On 2/12/13 1:04 PM, "Daniel Kulp" <[email protected]> wrote:
>
>The Dispatch things are not proxies and thus the ClientProxy.getClient
>call wouldn't work.
>
>I think you need to cast the Dispatch to a CXF specific DispatchImpl and
>call the getClient method on it:
>
>((org.apache.cxf.jaxws.DispatchImpl)dispatch).getClient();
>
>Hope that helps.
>
>
>Dan
>
>
>
>On Feb 11, 2013, at 7:27 PM, vishp <[email protected]> wrote:
>
>> I am using jax-ws (cxf 2.4.3) dispatch client to invoke a webservice.
>>Since
>> the wsdl specifies some policies, my call fails with the error
>> "javax.xml.ws.soap.SOAPFaultException: None of the policy alternatives
>>can
>> be satisfied".
>>
>> After researching the forums, it seems I need to add an interceptor to
>> handle this situation. Now all the sample code that I have seen to do
>>this
>> is like:
>> ...
>> Client client = ClientProxy.getClient(servicePort);
>> ...
>>
>> My code using the dispatch client is like:
>>
>> Service svc = Service.create(wsdlurl, serviceNs);
>> dispatch = svc.createDispatch(portName, SOAPMessage.class,
>> Service.Mode.MESSAGE);
>> Binding binding = dispatch.getBinding();
>> List<Handler> handlerChain = binding.getHandlerChain();
>> handlerChain.add(new SOAPLoggingHandler(logger));
>> binding.setHandlerChain(handlerChain);
>>
>> I dont know how to get a Client object from the dispatch api so that I
>>can
>> set interceptors like:
>> cxfClient.getInInterceptors().add(...);
>>
>> I found this link in this forum which suggests it should be very easy:
>>
>>http://cxf.547215.n5.nabble.com/adding-features-and-or-interceptors-to-a-
>>dynamic-jax-ws-dispatcher-client-td3200104.html
>> But after observing the interfaces for these classes and a few others,
>>I am
>> unable to figure it out. Pls help.
>>
>>
>>
>>
>> --
>> View this message in context:
>>http://cxf.547215.n5.nabble.com/adding-interceptors-to-a-dynamic-jax-ws-d
>>ispatcher-client-tp5723001.html
>> Sent from the cxf-user mailing list archive at Nabble.com.
>
>--
>Daniel Kulp
>[email protected] - http://dankulp.com/blog
>Talend Community Coder - http://coders.talend.com
>