假设我有一个控制器,它提供GET
请求并返回要序列化为 JSON 的 bean,并且还提供了一个IllegalArgumentException
可以在服务中引发的异常处理程序:
@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);
}
消息转换器是:
<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>
现在,当我在浏览器中请求给定的 URL 时,我会看到正确的 JSON 回复。但是,如果引发异常,字符串化的异常也会转换为 JSON,但我希望它由StringHttpMessageConverter
(生成的text/plain
mime 类型)处理。我怎么去呢?
为了使图片更完整(和复杂),假设我还有以下处理程序:
@RequestMapping(value = "/version", method = RequestMethod.GET)
@ResponseBody
public String getApplicationVersion() {
return "1.0.12";
}
此处理程序允许返回字符串由两者序列化,MappingJackson2HttpMessageConverter
并StringHttpMessageConverter
取决于Accept-type
客户端传递的内容。返回类型和值应如下所示:
+----+----------+---------- -+------------------+-------------- --------+ | 神经网络 | 网址 | 接受型 | 内容类型 | 消息转换器 | | | | 请求头 | 响应头 | | +----+----------+---------- -+------------------+-------------- --------+ | 1. | /版本 | 文本/html;*/* | 文本/纯文本 | StringHttpMessage 转换器 | | 2. | /版本 | 应用程序/json;*/* | 应用程序/json | MappingJackson2HttpMessageConverter | | 3. | /元/1 | 文本/html;*/* | 应用程序/json | MappingJackson2HttpMessageConverter | | 4. | /元/1 | 应用程序/json;*/* | 应用程序/json | MappingJackson2HttpMessageConverter | | 5. | /meta/0 (例外) | 文本/html;*/* | 文本/纯文本 | StringHttpMessage 转换器 | | 6. | /meta/0 (例外) | 应用程序/json;*/* | 文本/纯文本 | StringHttpMessage 转换器 | +----+----------+---------- -+------------------+-------------- --------+