Załóżmy Mam kontroler, który służy GET
żądania i zwraca Fasola być szeregowane do JSON, a także zapewnia obsługę wyjątków dla IllegalArgumentException
które mogą być podniesione w służbie:Jak zmienić typ zawartości w obsługi wyjątków
@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 są:
<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, kiedy zwrócić się do danego adresu URL w przeglądarce widzę prawidłową odpowiedź JSON. Jednakże, jeśli wyjątek zostanie podniesiony, sznurowany wyjątek jest konwertowany również na JSON, ale chciałbym, aby był przetwarzany przez StringHttpMessageConverter
(co daje w wyniku typ MIME text/plain
). Jak mogę to zrobić?
aby obraz bardziej kompletne (i skomplikowane), załóżmy, że mam również następujące Handler:
@RequestMapping(value = "/version", method = RequestMethod.GET)
@ResponseBody
public String getApplicationVersion() {
return "1.0.12";
}
Ten uchwyt pozwala ciąg powrót do odcinkach zarówno MappingJackson2HttpMessageConverter
i StringHttpMessageConverter
zależności w upłynął Accept-type
przez klient. Rodzaje i zwracane 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 | +----+---------------------+-----------------------+------------------+-------------------------------------+
Brzmi nieźle. Ale jak zostaną obsłużone scenariusze (3, 4)? –
Dzięki za podpowiedź z 'ResponseEntity'!A co z ustawieniem właściwości 'supportedMediaTypes' dla' StringHttpMessageConverter' (patrz [moja odpowiedź] (http://stackoverflow.com/a/12979543/267197))? To też może być rozwiązanie. –
Właśnie sprawdziłem twoje rozwiązanie za pomocą 'ResponseEntity': to nie działa. Typ zawartości jest nadpisywany przez konwerter wiadomości, a konwerter wiadomości jest wybierany (algorytmy przybliżone) przez przecięcie 'Accept-type' oraz converted' supportedMediaTypes'. –