Supponiamo che io sono un controller che serve GET
richiesta e restituisce fagioli essere serializzato per JSON e fornisce anche un gestore di eccezioni per IllegalArgumentException
che può essere sollevato in servizio:Come cambiare il tipo di contenuto nel gestore di eccezioni
@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);
}
convertitori messaggi sono:
<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>
Ora, quando chiedo il dato URL nel navigatore vedo la risposta JSON corretta. Tuttavia, se viene sollevata un'eccezione, l'eccezione stringificata viene convertita anche in JSON, ma mi piacerebbe che venisse elaborata da StringHttpMessageConverter
(tipo risultante text/plain
mime). Come posso andare?
per rendere l'immagine più completa (e complicato), supponiamo di avere anche il seguente gestore:
@RequestMapping(value = "/version", method = RequestMethod.GET)
@ResponseBody
public String getApplicationVersion() {
return "1.0.12";
}
Questo gestore consente la stringa di ritorno da serializzare sia MappingJackson2HttpMessageConverter
e StringHttpMessageConverter
seconda in passato Accept-type
dal cliente. I tipi e valori di ritorno devono essere il seguente:
+----+---------------------+-----------------------+------------------+-------------------------------------+ | 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 | +----+---------------------+-----------------------+------------------+-------------------------------------+
Suona bene. Ma come verranno gestiti gli scenari (3,4)? –
Grazie per il suggerimento con 'ResponseEntity'!Per quanto riguarda l'impostazione della proprietà 'supportedMediaTypes' per' StringHttpMessageConverter' (vedere [risposta mia] (http://stackoverflow.com/a/12979543/267197))? Potrebbe anche essere una soluzione. –
Ho appena controllato la tua soluzione con 'ResponseEntity': non funziona. Il tipo di contenuto è sovrascritto dal convertitore di messaggi e il convertitore di messaggi viene scelto (algoritmi approssimativi) intersecando 'Accept-type' e convertitori 'supportedMediaTypes'. –