我是实现SpringBoot + RestfulWebservice的新手。在我的项目中,使用@ControllerAdvice全局处理异常,并创建Custom类以String格式设置错误代码和错误消息。我们将错误对象传递给HTTPResponse并重现了响应。但是我想知道如何以JSON格式将错误消息转换为,我们没有明确使用任何httpMessageConverter。
- Is Spring Boot internally do the conversion?
[请帮助我了解行为。给我一些见解,尽管您觉得这是基本问题。
基本上,当您不提供有关内容类型协商的详细信息时,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
默认情况下,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”标头来确定要发送的数据类型。