Supposons que j'ai un contrôleur qui sert demande GET
et retourne haricots à sérialisé JSON et fournit également un gestionnaire d'exception pour IllegalArgumentException
qui peut être soulevée en service:Comment changer le type de contenu dans le gestionnaire d'exception
@RequestMapping(value = "/meta/{itemId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public MetaInformation getMetaInformation(@PathVariable int itemId) {
return myService.getMetaInformation(itemId);
}
@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
@ResponseBody
public String handleIllegalArgumentException(IllegalArgumentException ex) {
return ExceptionUtils.getStackTrace(ex);
}
de message sont des convertisseurs:
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
<bean class="org.springframework.http.converter.StringHttpMessageConverter" />
</mvc:message-converters>
</mvc:annotation-driven>
maintenant, quand je demande l'URL donnée dans le navigateur, je vois la réponse JSON correcte. Cependant, si une exception est levée, l'exception stringifiée est également convertie en JSON, mais j'aimerais qu'elle soit traitée par StringHttpMessageConverter
(résultat: text/plain
mime type). Comment puis-je y aller?
Pour rendre l'image plus complète (et complexe), supposons que j'ai aussi le gestionnaire suivant:
@RequestMapping(value = "/version", method = RequestMethod.GET)
@ResponseBody
public String getApplicationVersion() {
return "1.0.12";
}
Ce gestionnaire permet à la chaîne de retour à sérialisé par les deux MappingJackson2HttpMessageConverter
et StringHttpMessageConverter
selon au passé Accept-type
par la client. Les types de retour et les valeurs doivent être les suivantes:
+----+---------------------+-----------------------+------------------+-------------------------------------+ | NN | URL | Accept-type | Content-type | Message converter | | | | request header | response header | | +----+---------------------+-----------------------+------------------+-------------------------------------+ | 1. | /version | text/html; */* | text/plain | StringHttpMessageConverter | | 2. | /version | application/json; */* | application/json | MappingJackson2HttpMessageConverter | | 3. | /meta/1 | text/html; */* | application/json | MappingJackson2HttpMessageConverter | | 4. | /meta/1 | application/json; */* | application/json | MappingJackson2HttpMessageConverter | | 5. | /meta/0 (exception) | text/html; */* | text/plain | StringHttpMessageConverter | | 6. | /meta/0 (exception) | application/json; */* | text/plain | StringHttpMessageConverter | +----+---------------------+-----------------------+------------------+-------------------------------------+
Ça a l'air bien. Mais comment les scénarios (3,4) seront-ils traités? –
Merci pour l'indice avec ResponseEntity!Qu'en est-il de la définition de la propriété 'supportedMediaTypes' pour' StringHttpMessageConverter' (voir [ma réponse] (http://stackoverflow.com/a/12979543/267197))? Cela pourrait aussi être une solution. –
Je viens de vérifier votre solution avec ResponseEntity: cela ne fonctionne pas. Le type de contenu est remplacé par un convertisseur de message, et un convertisseur de message est choisi (algorithmes approximatifs) en croisant 'Accept-type' et' supportedMediaTypes' du convertisseur. –