I'm having trouble with the CXF policy framework, which is causing a
little bit of grief. I think this is a developer, as opposed to a
user issue, as I /think/ it points to a bug in the policy framework.
If not, I can migrate the conversation to the users list.
What I'm finding is that a CXF server that has policy defined at the
endpoint (I'm using the CXF policy feature, whereby you can reference
a WS-Policy expression in Spring) is effectively treating the
operative policy in the server on the outbound interceptor chain the
same way as it does on the inbound interceptor chain.
Let me be more concrete. Assume the following config fragment in
Spring:
<jaxws:endpoint ... >
<jaxws:features>
<cxfp:policies>
<wsp:PolicyReference URI="#MyPolicy"/>
</cxfp:policies>
</jaxws:features>
</jaxws:endpoint>
...
<wsp:Policy wsu:Id="MyPolicy">
...
</wsp:Policy>
So on the inbound server side, I definitely get this as the effective
policy, and I can do policy enforcement by setting the asserted flag
on various assertions selected (in the case of inbound server,
everything is selected). Note that I have interceptors installed in
the runtime to do this enforcement.
However, on the outbound response, I'm getting the same effective
policy, and I can see how it's getting set -- precisely in the
following stacktrace (pardon the wrap):
Thread [btpool2-1] (Suspended)
InitializingPolicyEngine
(PolicyEngineImpl).getEndpointPolicy(EndpointInfo, EndpointPolicy,
boolean, Assertor) line: 220
InitializingPolicyEngine
(PolicyEngineImpl).getServerEndpointPolicy(EndpointInfo, Destination)
line: 214
EffectivePolicyImpl.initialisePolicy(EndpointInfo,
BindingOperationInfo, PolicyEngineImpl, boolean) line: 101
EffectivePolicyImpl.initialise(EndpointInfo, BindingOperationInfo,
PolicyEngineImpl, Assertor, boolean) line: 79
InitializingPolicyEngine
(PolicyEngineImpl).getEffectiveServerResponsePolicy(EndpointInfo,
BindingOperationInfo, Destination) line: 171
ServerPolicyOutInterceptor.handle(Message) line: 77
ServerPolicyOutInterceptor
(AbstractPolicyInterceptor).handleMessage(Message) line: 56
PhaseInterceptorChain.doIntercept(Message) line: 221
OutgoingChainInterceptor.handleMessage(Message) line: 74
PhaseInterceptorChain.doIntercept(Message) line: 221
ChainInitiationObserver.onMessage(Message) line: 78
JettyHTTPDestination.serviceRequest(ServletContext,
HttpServletRequest, HttpServletResponse) line: 278
JettyHTTPDestination.doService(ServletContext, HttpServletRequest,
HttpServletResponse) line: 252
JettyHTTPHandler.handle(String, HttpServletRequest,
HttpServletResponse, int) line: 70
ContextHandler.handle(String, HttpServletRequest,
HttpServletResponse, int) line: 726
ContextHandlerCollection.handle(String, HttpServletRequest,
HttpServletResponse, int) line: 206
Server(HandlerWrapper).handle(String, HttpServletRequest,
HttpServletResponse, int) line: 152
Server.handle(HttpConnection) line: 324
HttpConnection.handleRequest() line: 505
HttpConnection$RequestHandler.content(Buffer) line: 842
HttpParser.parseNext() line: 730
HttpParser.parseAvailable() line: 205
HttpConnection.handle() line: 380
SslSocketConnector$SslConnection(SocketConnector$Connection).run()
line: 228
SslSocketConnector$SslConnection.run() line: 620
BoundedThreadPool$PoolThread.run() line: 450
But in this case, there are no interceptors installed in the response
interceptor chain. As a consequence, the request "fails" (in a
manner
described below) with a "None of the policy alternatives can be
satisfied" message, which is set in the
PolicyVerificationOutInterceptor.
Note, however, that the SOAP:Fault is actually embedded in the
response:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/
envelope/">
<soap:Body>
<sayHiResponse xmlns="http://acme.com/greeter/types">
<responseType>Bonjour tony</responseType>
</sayHiResponse>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>None of the policy alternatives can be
satisfied.</faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>
Oops. Something seems awry with the phase in which the fault is
written.
But regardless, should the effective policy on the response be the
same as the effective policy on the request? Or should policy
assertion implementors code their interceptors to handle the response
chain, as well as the request?
-Fred