2626import org .springframework .ws .client .WebServiceClientException ;
2727import org .springframework .ws .client .support .interceptor .ClientInterceptor ;
2828import org .springframework .ws .context .MessageContext ;
29+ import org .springframework .ws .server .EndpointExceptionResolver ;
2930import org .springframework .ws .soap .SoapBody ;
3031import org .springframework .ws .soap .SoapFault ;
3132import org .springframework .ws .soap .SoapHeaderElement ;
3536
3637/**
3738 * Interceptor base class for interceptors that handle WS-Security. Can be used on the server side, registered in a
38- * {@link org.springframework.ws.server.endpoint.mapping.AbstractEndpointMapping#setInterceptors(org.springframework.ws.server.EndpointInterceptor[]) endpoint mapping};
39- * or on the client side, on the {@link org.springframework.ws.client.core.WebServiceTemplate#setInterceptors(ClientInterceptor[]) web service template}.
39+ * {@link org.springframework.ws.server.endpoint.mapping.AbstractEndpointMapping#setInterceptors(org.springframework.ws.server.EndpointInterceptor[])
40+ * endpoint mapping}; or on the client side, on the {@link org.springframework.ws.client.core.WebServiceTemplate#setInterceptors(ClientInterceptor[])
41+ * web service template}.
4042 * <p/>
4143 * Subclasses of this base class can be configured to secure incoming and secure outgoing messages. By default, both are
4244 * on.
@@ -60,6 +62,8 @@ public abstract class AbstractWsSecurityInterceptor implements SoapEndpointInter
6062
6163 private boolean validateResponse = true ;
6264
65+ private EndpointExceptionResolver exceptionResolver ;
66+
6367 /** Indicates whether server-side incoming request are to be validated. Defaults to <code>true</code>. */
6468 public void setValidateRequest (boolean validateRequest ) {
6569 this .validateRequest = validateRequest ;
@@ -80,6 +84,11 @@ public void setValidateResponse(boolean validateResponse) {
8084 this .validateResponse = validateResponse ;
8185 }
8286
87+ /** Provide an {@link EndpointExceptionResolver} for resolving validation exceptions. */
88+ public void setExceptionResolver (EndpointExceptionResolver exceptionResolver ) {
89+ this .exceptionResolver = exceptionResolver ;
90+ }
91+
8392 /*
8493 * Server-side
8594 */
@@ -252,8 +261,16 @@ protected boolean handleValidationException(WsSecurityValidationException ex, Me
252261 if (logger .isWarnEnabled ()) {
253262 logger .warn ("Could not validate request: " + ex .getMessage ());
254263 }
255- SoapBody response = ((SoapMessage ) messageContext .getResponse ()).getSoapBody ();
256- response .addClientOrSenderFault (ex .getMessage (), Locale .ENGLISH );
264+ if (exceptionResolver != null ) {
265+ exceptionResolver .resolveException (messageContext , null , ex );
266+ }
267+ else {
268+ if (logger .isDebugEnabled ()) {
269+ logger .debug ("No exception resolver present, creating basic soap fault" );
270+ }
271+ SoapBody response = ((SoapMessage ) messageContext .getResponse ()).getSoapBody ();
272+ response .addClientOrSenderFault (ex .getMessage (), Locale .ENGLISH );
273+ }
257274 return false ;
258275 }
259276
0 commit comments