gpt4 book ai didi

spring - 如何更改异常处理程序中的内容类型

转载 作者:IT老高 更新时间:2023-10-28 13:46:28 25 4
gpt4 key购买 nike

假设我有一个 Controller ,它为 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";
}

此处理程序允许 MappingJackson2HttpMessageConverterStringHttpMessageConverter 序列化返回字符串,具体取决于客户端传递的 Accept-type。返回类型和值应如下所示:

+----+---------------------+-----------------------+------------------+-------------------------------------+| 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          |+----+---------------------+-----------------------+------------------+-------------------------------------+

最佳答案

我认为从 getMetaInformation@RequestMapping 中删除 produces = MediaType.APPLICATION_JSON_VALUE 会给你想要的结果。

response-type 将根据 Accept header 中的 content-type 值协商。


编辑

由于这不包括场景 3,4,这里是一个直接使用 ResponseEntity.class 的解决方案:

@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleIllegalArgumentException(Exception ex) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.TEXT_PLAIN);
return new ResponseEntity<String>(ex.getMessage(), headers, HttpStatus.BAD_REQUEST);
}

关于spring - 如何更改异常处理程序中的内容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12977368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com