Jak zmienić typ zawartości w programie obsługi wyjątków
Załóżmy, że mam kontroler, który służyGET
request i zwraca komponent bean do serializacji do JSON, a także zapewnia obsługę wyjątków dlaIllegalArgumentException
które można podnieść w służbie:
@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);
}
Konwertery wiadomości to:
<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>
Teraz, gdy żądam podanego adresu URL w przeglądarce, widzę poprawną odpowiedź JSON. Jeśli jednak zostanie zgłoszony wyjątek, wyjątek ze zwężeniem jest również konwertowany na JSON, ale chciałbym, aby był przetwarzany przezStringHttpMessageConverter
(wynikłytext/plain
typ mime). Jak mogę to zrobić?
Aby uczynić obraz bardziej kompletnym (i skomplikowanym), załóżmy, że mam również następujący program obsługi:
@RequestMapping(value = "/version", method = RequestMethod.GET)
@ResponseBody
public String getApplicationVersion() {
return "1.0.12";
}
Ta obsługa pozwala na serializację ciągu zwrotnego przez obaMappingJackson2HttpMessageConverter
iStringHttpMessageConverter
w zależności od minionegoAccept-type
przez klienta. Typy zwracane i wartości powinny być następujące:
+----+---------------------+-----------------------+------------------+-------------------------------------+ | 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 | +----+---------------------+-----------------------+------------------+-------------------------------------+