Développer des services REST avec Spring 3 – Part 2/2

Suite de l'article "Développer des services REST avec Spring 3 - Part 212" sur la mise en œuvre de service REST en Spring, dans lequel nous allons voir une seconde méthode basée sur les HttpMessageConverters.

Methode 2 : Utiliser les HttpMessageConverters

Pour répondre de manière plus spécifique aux problèmes d’exposition de service REST, Spring propose une nouvelle approche depuis la version 3 : l’utilisation de l’annotation @RequestBody qui permet l’utilisation systématique d’un  HttpMessageConverters.

Qu’est ce que cela change ?

Au lieu de retourner un ModelView (ou le nom d’une vue), la méthode retourne directement le contenu à retourner, ce qui se traduit par un objet ou une collection d’objets. Ensuite le HttpMessageConverters se charge de convertir ces objets vers le flux de données attendu par le client.

L’activation des HttpMessageConverter est réalisée en déclarant la ligne suivante dans la configuration Spring :

<mvc:annotation-driven/>

Cette déclaration permet de charger les HttpMessageConverter par défaut fournit par Spring :

StringHttpMessageConverter Lit/écrit un String à partir d’une requête ou d’une réponse. Par défaut il répond aux medias de type « text/* » et retourne un contenu de type « text/plain ».
FormHttpMessageConverter Lit/écrit un Data Form à partir d’une requête ou d’une réponse. Par défaut il répond aux medias de type « application/x-www-form-urlencoded» et retourne un contenu à l’aide d’un MultiValueMap<String,String>.
MarshallingHttpMessageConverter Lit/écrit des données  XML en utilisant les marshaller/unmarshaller fournit par Spring . Par défaut il retourne un contenu de type « application/xml ».
MappingJacksonHttpMessageConverter Lit/écrit des données  JSON en utilisant la librairie Jackson's en tant qu’ObjectMapper. Il convertit des données de type  « application/json ».
AtomFeedHttpMessageConverter Lit/écrit des flux de données au format ATOM à l’aide de la librairie ROME. Il convertit des données de type  « application/atom+xml ».
RssChannelHttpMessageConverter Lit/écrit des flux ATOM à l’aide de la librairie ROME Il convertit des données de type  « application/rss+xml ».

Si vous souhaitez déclarer vos propres HttpMessageConverter, il faut le déclare ainsi :

<mvc:annotation-driven>
   <mvc:message-converters register-defaults="false">
     <ref bean="jsonHttpMessageConverter"/>
   </mvc:message-converters>
</mvc:annotation-driven>

<bean
 class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
   <property name="prefixJson" value="false"/>
   <property name="supportedMediaTypes" value="application/json"/>
</bean>    

A noter que l’attribut register-defaults permet de définir si les HttpMessageConverter par défaut sont également déclarer ou pas.

Si l’on reprend  l’exemple d’un service REST  qui  permettrait de retourner le contenu d’un bean Java en XML ou en Json en fonction de l’extension de l’url, tout le déclaratif est réalisé au niveau du controller :

@Controller
@RequestMapping(value="/todo")
public class TodoRestServiceWithHTTPConverter { 

  @Autowired 
  private TodoService todoService; 
  /*
  * Return always Json data
  */
  @RequestMapping(value="/{id}.json", method= RequestMethod.GET,
                  produces="application/json")
  @ResponseBody public Todo findAsJson(@PathVariable("id") Long id) {
     return todoService.find(id);
  }

  /*
  * Return always XML data
  */ 
  @RequestMapping(value="/{id}.xml", method= RequestMethod.GET,
                  produces="application/xml") 
  @ResponseBody 
  public Todo findAsXML(@PathVariable("id") Long id) { 
    return todoService.find(id);
  }
}

L’attribut produces permet de définir le format de sortie et de faire le lien avec le HttpMessageConverter compatible.

En conclusion, nous avons vu deux méthodes pour exposer des services REST avec Spring. La mise en oeuvre a été réalisée sur un POC disponible sur GitHub à l'adresse suivante:

https://github.com/ochaumont/spring-rest-simple.git

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.