在之前的所有SpringBoot教程中,我们只提到和使用了针对HTML和JSON格式的请求和响应处理。那么如何在Controller中快速将XML格式的请求打包成一个对象,并返回一个XML格式的对象呢?实现原理:消息转换器(MessageConverter)在展开以上问题之前,我们首先要知道SpringBoot是采用SpringMVC来处理HTTP请求的实现。在SpringMVC中,有一个消息转换器的概念,它主要负责处理各种格式的请求数据,并将其转换为对象,以提供更好的编程体验。SpringMVC中定义了HttpMessageConverter接口,抽象了消息转换器类型的判断,读写的判断和操作。具体可以看到如下定义:?extendsT>clazz,HttpInputMessageinputMessage)throwsIOException,HttpMessageNotReadableException;voidwrite(Tt,@NullableMediaTypecontentType,HttpOutputMessageoutputMessage)throwsIOException,HttpMessageNotWritableException;}众所周知,HTTP请求的Content-Type定义有多种格式。如果要支持Xml格式的消息转换,就必须使用相应的转换器。SpringMVC默认已经有一套Jackson实现的转换器MappingJackson2XmlHttpMessageConverter。扩展实现第一步:引入Xml消息转换器在传统的Spring应用中,我们可以通过如下配置实现Xml格式数据的消息转换:xml();builder.indentOutput(true);converters.add(newMappingJackson2XmlHttpMessageConverter(builder.build()));}}SpringBoot应用不需要像上面那么麻烦,只需要添加jackson-dataformat-xml依赖,SpringBoot会自动引入MappingJackson2XmlHttpMessageConverter的实现:com.fasterxml.jackson.dataformatjackson-dataformat-xml同时为了配置Xml数据和用于维护关系的注解对象属性也在上面的依赖中,所以这个依赖也是必须的。第二步:定义对象与Xml的关系基本扩展完成后,下面就可以定义Xml内容对应的Java对象了,例如:@Data@NoArgsConstructor@AllArgsConstructor@JacksonXmlRootElement(localName="User")publicclassUser{@JacksonXmlProperty(localName="name")privateStringname;@JacksonXmlProperty(localName="age")privateIntegerage;}其中:@Data、@NoArgsConstructor、@AllArgsConstructor是lombok简化代码的注解,主要用于生成get、set和构造函数。@JacksonXmlRootElement和@JacksonXmlProperty注解用于维护xml中对象属性的对应关系。可以映射到上面配置的User对象的xml示例如下(后面可以用上面的xml请求接口):aaaa10第三步:创建接收xml请求的接口完成转换对象后,就可以编写接收xml并返回xml的接口,例如:@ControllerpublicclassUserController{@PostMapping(value="/user",consumes=MediaType.APPLICATION_XML_VALUE,produces=MediaType.APPLICATION_XML_VALUE)@ResponseBodypublicUsercreate(@RequestBodyUseruser){user.setName("didispace.com:"+user.getName());user.setAge(user.getAge()+100);returnuser;}}***,启动SpringBoot应用,通过POSTMAN等请求工具试试这个接口,可以看到请求Xml,返回处理后的Xml内容。案例代码可在以下两个仓库的chapter3-1-8目录查看:GithubGitee【本文为专栏作者“翟永超”原创稿件,转载请联系作者获得授权】点此查看作者的更多好文章