SpringBoot如何以JSON格式返回errorResponse?

问题描述 投票:0回答:2

我是实现SpringBoot + RestfulWebservice的新手。在我的项目中,使用@ControllerAdvice全局处理异常,并创建Custom类以String格式设置错误代码和错误消息。我们将错误对象传递给HTTPResponse并重现了响应。但是我想知道如何以JSON格式将错误消息转换为,我们没有明确使用任何httpMessageConverter。

- Is Spring Boot internally do the conversion?

[请帮助我了解行为。给我一些见解,尽管您觉得这是基本问题。

json rest spring-boot httpresponse
2个回答
0
投票

基本上,当您不提供有关内容类型协商的详细信息时,Spring Boot对于所有事情默认都使用JSON。

根据关于使用here处理错误@ControllerAdvice的spring boot文档,默认情况下会产生JSON格式的错误。从文档:

您还可以定义一个用@ControllerAdvice注释的类,以自定义JSON文档以针对特定的控制器和/或异常类型返回,如以下示例所示:

mkyong.com上的[This page很好地写了有关如何自定义ControllerAdvice错误处理的信息。

作为JSON用法的示例,这个非常裸露的骨头控制器将尽最大努力将任何POJO呈现为JSON(请注意,如果您仅提供类似long的基元,它将简单地以文本形式返回该基元,但是设置内容-类型为application/json

@RequestMapping("api/time")
@RestController
public class TestApi {

    @GetMapping
    public Map<String, Long> time(){
        Map<String, Long> res = new HashMap<String, Long>();
        res.put("time_in_nanos", System.nanoTime());
        return res;
    }
}

示例:

$ curl -v http://localhost:8080/api/time
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> GET /api/time HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Tue, 04 Feb 2020 04:18:35 GMT
<
* Connection #0 to host localhost left intact
{"time_in_nanos":47078744054692}

这是默认请求(即没有Accept标头或Accept: */*),如果您指定application/xml或其他内容,则通常不起作用:

$ curl -v http://localhost:8080/api/time --header 'Accept: application/xml'
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> GET /api/time HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.64.1
> Accept: application/xml
>
< HTTP/1.1 406
< Content-Length: 0
< Date: Tue, 04 Feb 2020 04:17:38 GMT
<
* Connection #0 to host localhost left intact
* Closing connection 0

0
投票

默认情况下,springboot在启动时会注册以下HttpMessageConverters

ByteArrayHttpMessageConverter – converts byte arrays
StringHttpMessageConverter – converts Strings
ResourceHttpMessageConverter – converts org.springframework.core.io.Resource for any type of octet stream
SourceHttpMessageConverter – converts javax.xml.transform.Source
FormHttpMessageConverter – converts form data to/from a MultiValueMap<String, String>.
Jaxb2RootElementHttpMessageConverter – converts Java objects to/from XML (added only if JAXB2 is present on the classpath)
MappingJackson2HttpMessageConverter – converts JSON (added only if Jackson 2 is present on the classpath)
MappingJacksonHttpMessageConverter – converts JSON (added only if Jackson is present on the classpath)
AtomFeedHttpMessageConverter – converts Atom feeds (added only if Rome is present on the classpath)
RssChannelHttpMessageConverter – converts RSS feeds (added only if Rome is present on the classpath)

因此,如果从控制器通知中返回对象,则默认情况下,spring会自动调用Jackson转换器将对象转换为有效的Json响应。

基本上springboot会检查MIME类型,以决定要使用HttpMessageConverter的实现。此外,它还将取决于“ Accept”标头来确定调用方期望的数据类型。如果收到了请求, springboot将使用“ Content-type”标头来确定要发送的数据类型。

© www.soinside.com 2019 - 2024. All rights reserved.