Spring Boot custom HTTP message converter, springboot
When building a RESTful data service, we defined controller and repositories and modified them with some annotations, but so far, we have not performed object conversion-converting java object to HTTP data output stream. At the underlying layer of Spring Boot, HttpMessageConverters relies on the Jackson library to output Java entity classes in JSON format. When multiple converters are available, select the most suitable one based on the message object type and the required content type.
In the text of the SpringMVC source code analysis message converter HttpMessageConverter, a figure clearly shows the location of the message converter.
Location of the message Converter
The objective of the message converter is to convert the HTTP input request format to the Java object, and convert the Java object to the HTTP output request. Some message converters only support multiple data types, some support only multiple output formats, and some support both. For example, MappingJackson2HttpMessageConverter can convert a Java object to application/json, while ProtobufHttpMessageConverter only supports com. google. protobuf. message Type input, but can output application/json, application/xml, text/plain and application/x-protobuf in so many formats.
How Do
There are three ways to configure the message converter in the project, the main difference is the customizable and easy-to-use measurement.
Add @ Bean definition to the WebConfiguration class
@Beanpublic ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() { return new ByteArrayHttpMessageConverter();}
Override configureMessageConverters method to extend the linked list of the existing message converter;
@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(new ByteArrayHttpMessageConverter());}
For more control, you can override the extendMessageConverters method, first clear the converter list, and then add a custom converter.
@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) { converters.clear(); converters.add(new ByteArrayHttpMessageConverter());}
Analysis
Spring provides multiple methods to accomplish the same task. It depends on whether we are more convenient or customizable.
What are the differences between the three methods mentioned above?
Defining HttpMessageConverter using @ Bean is the easiest way to add a message converter to a project, similar to adding Servlet Filters. If Spring scans the HttpMessageConverter type bean, it is automatically added to the call chain. We recommend that you inherit WebConfiguration from webmvcjavaseradapter in the project.
It is convenient to add a custom Converter by rewriting the configureMessageConverters method, but there is a weakness: if there are multiple webmvccyclers instances in the project (defined by ourselves or provided by Spring Boot by default ), the overwritten configureMessageConverters method cannot be executed in a fixed order.
If you need more refined control: to clear other message converters or clear repeated converters, you can rewrite extendMessageConverters. The possibility is that other WebMvcConfigurer instances can also rewrite this method, however, this probability is very small.
The above is all the content of this article. I hope it will be helpful for your learning and support for helping customers.