In questo articolo vedremo come poter intercettare le richieste di servizio per effettuare le operazioni prima e dopo l'esecuzione dell'endpoint.

Fondamentale l'interceptor ci permette di:

  • loggare le richieste e le risposte inviate
  • applicare dei meccanismi di sicurezza alle richieste pervenute
  • gestire i fault di sistema
Per definire un interceptor occorre implementare l'interfaccia EndpointInterceptot che presenta i seguenti metodi:
  • handleRequest
  • handleResponse
  • handleFault
Il metodo handleRequest viene invocato prima dell'esecuzione dell'endpoint e il suo utilizzo principale è quello di bloccare l'esecuzione di un servizio.
Il metodo handleResponse viene invocato dopo l'esecuzione dell'endpoint e il sul utilizzo principale è quello di elaborare la risposta, magari aggiungendo attributi.
Il metodo handleFault viene invocato dopo l'esecuzione di un fault con finalità analoghe a quelle del metodo handleResponse.
Per chi non avesse particolari esigenze Spring offre già alcune implementazioni di interceptor:
  • PayloadLoggingInterceptor
  • PayloadValidatingInterceptor
  • PayloadTransformingInterceptor
Il PayloadLoggingInterceptor permette di loggare le richieste e le risposte.
Il PayloadValidatingInterceptor valida le richieste e le risposte in base ad uno schema xsd indicato nelle sue properties.
Il PayloadTransformingInterceptor effettua una transformazione delle richieste e delle risposte basate su XSLT. Viene usato quando il server gestisce più versioni dello stesso servizio.

Nel nostro progetto applichiamo un logger delle richieste e delle risposte e un validatore, ottenendo una configurazione di questo tipo.

<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping">
<property name="mappings">
        <props>
            <prop key="{http://www.example.org/schema}RicercaLibroRequest">ricercaLibroEndpoint</prop>
        </props>
    </property>
    <property name="interceptors">
	    <list>
              <ref bean="loggingInterceptor"/>
              <ref bean="validatingInterceptor"/>
          </list>
        </property>
    </bean>

<bean id="loggingInterceptor"  
      class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor"/>

<bean id="validatingInterceptor" 
      class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor">
    <property name="schema" value="classpath:schema.xsd"/>
    <property name="validateRequest" value="true"/>
    <property name="validateResponse" value="true"/>
</bean>

Prossimo