In questo articolo vedremo le tecniche di marshalling che mette a disposizione Spring-ws per la gestione dei messaggi di richiesta e risposta dei web services.

Tutte le implementazione degli endpoint fornite dal framework prevedono 2 proprietà:

  • marshaller
  • unmarshaller
Il marshaller è responsabile di serializzare l'oggetto in un frammento xml, mentre l'unmarsheller effettua l'operazione contraria.
Sono previste più implementazioni dei marsheller, pertanto lo sviluppatore può scegliere con libertà l'implementazione più conveniente. Personalmente utilizzo jaxb2 che è disponibile a partire da java 6 con la virtual machine.
Per le altre implementazioni JAXB1, Castor, XMLBEANS rimando alla javadoc disponibile su spring-ws.
Definiamo il bean che descrive il marshaller e lo settiamo come attributo dell'endpoint
<bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
       <property name="contextPath" value="it.finazzo.libreria.schema"/>
       <property name="schema" value="classpath:schema.xsd"/>
</bean>
<bean id="ricercaLibroEndpoint" class="it.finazzo.libreria.ws.RicercaLibroEndpoint">
      <property name="marshaller" ref="jaxb2Marshaller"></property>
      <property name="unmarshaller" ref="jaxb2Marshaller"></property>
</bean>
La property schema del marshaller serve per la validazione della richiesta, mentre nella property contextPath specifichiamo il package dove sono disponibili le classi per il marshalling. Tali classi possono essere generate in automatico tramite un plugin disponibile per Maven. Per sfruttare questo plugin occorre inserire questo frammento nel pom.xml
<plugin>
       <groupId>com.sun.tools.xjc.maven2</groupId>
       <artifactId>maven-jaxb-plugin</artifactId>
       <executions>
             <execution>
                 <phase>generate-sources</phase>
                  <goals>
                      <goal>generate</goal>
                  </goals>
             </execution>
       </executions>
       <configuration>
            <generatePackage>it.finazzo.libreria.schema</generatePackage>
       </configuration>
</plugin>

e definire le resources

<resource> <directory>src/main/resources</directory> <filtering>true</filtering>
</resource>
Tale plugin analizza i file xsd disponibili nella directory resource e genera le classi nel package configurato.
Infine occorre cambiare l'implementazione dell'endpoint estendendo la classe di spring-ws che supporta il marshalling:
public class RicercaLibroEndpoint extends AbstractMarshallingPayloadEndpoint {
protected Object invokeInternal(Object arg0) throws Exception {
return new RicercaLibroResponse();
}
}
A questo punto mvn install e proviamo il frutto delle nostre fatiche.

Prossimo