zoukankan      html  css  js  c++  java
  • Spring Boot 2.x基础教程:如何扩展XML格式的请求和响应

    在之前的所有Spring Boot教程中,我们都只提到和用到了针对HTML和JSON格式的请求与响应处理。那么对于XML格式的请求要如何快速的在Controller中包装成对象,以及如何以XML的格式返回一个对象呢?

    实现原理:消息转换器(Message Converter)

    在扩展上述问题之前,我们先要知道Spring Boot中处理HTTP请求的实现是采用的Spring MVC。而在Spring MVC中有一个消息转换器这个概念,它主要负责处理各种不同格式的请求数据进行处理,并包转换成对象,以提供更好的编程体验。

    在Spring MVC中定义了HttpMessageConverter接口,抽象了消息转换器对类型的判断、对读写的判断与操作,具体可见如下定义:

    public interface HttpMessageConverter<T> {
    
        boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);
    
        boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);
    
        List<MediaType> getSupportedMediaTypes();
    
        T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException;
    
        void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException;
    
    }
    

    众所周知,HTTP请求的Content-Type有各种不同格式定义,如果要支持Xml格式的消息转换,就必须要使用对应的转换器。Spring MVC中默认已经有一套采用Jackson实现的转换器MappingJackson2XmlHttpMessageConverter

    扩展实现

    第一步:引入Xml消息转换器

    在传统Spring应用中,我们可以通过如下配置加入对Xml格式数据的消息转换实现:

    @Configuration
    public class MessageConverterConfig1 extends WebMvcConfigurerAdapter {
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.xml();
            builder.indentOutput(true);
            converters.add(new MappingJackson2XmlHttpMessageConverter(builder.build()));
        }
    }
    

    在Spring Boot应用不用像上面这么麻烦,只需要加入jackson-dataformat-xml依赖,Spring Boot就会自动引入MappingJackson2XmlHttpMessageConverter的实现:

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
    </dependency>
    

    同时,为了配置Xml数据与维护对象属性的关系所要使用的注解也在上述依赖中,所以这个依赖也是必须的。

    第二步:定义对象与Xml的关系

    做好了基础扩展之后,下面就可以定义Xml内容对应的Java对象了,比如:

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @JacksonXmlRootElement(localName = "User")
    public class User {
    
        @JacksonXmlProperty(localName = "name")
        private String name;
        @JacksonXmlProperty(localName = "age")
        private Integer age;
    
    }
    

    其中:@Data@NoArgsConstructor@AllArgsConstructor是lombok简化代码的注解,主要用于生成get、set以及构造函数。@JacksonXmlRootElement@JacksonXmlProperty注解是用来维护对象属性在xml中的对应关系。

    上述配置的User对象,其可以映射的Xml样例如下(后续可以使用上述xml来请求接口):

    <User>
    	<name>aaaa</name>
    	<age>10</age>
    </User>
    

    第三步:创建接收xml请求的接口

    完成了要转换的对象之后,可以编写一个接口来接收xml并返回xml,比如:

    @Controller
    public class UserController {
    
        @PostMapping(value = "/user", 
            consumes = MediaType.APPLICATION_XML_VALUE, 
            produces = MediaType.APPLICATION_XML_VALUE)
        @ResponseBody
        public User create(@RequestBody User user) {
            user.setName("didispace.com : " + user.getName());
            user.setAge(user.getAge() + 100);
            return user;
        }
    
    }
    

    最后,启动Spring Boot应用,通过POSTMAN等请求工具,尝试一下这个接口,可以看到请求Xml,并且返回了经过处理后的Xml内容。

    本系列教程《Spring Boot 2.x基础教程》点击直达!。学习过程中如遇困难,建议加入Spring技术交流群,参与交流与讨论,更好的学习与进步!

    代码示例

    本文的相关例子可以查看下面仓库中的chapter2-8目录:

    如果您觉得本文不错,欢迎Star支持,您的关注是我坚持的动力!

    欢迎关注我的公众号:程序猿DD,分享外面看不到的干货与思考!

  • 相关阅读:
    PTA —— 基础编程题目集 —— 函数题 —— 61 简单输出整数 (10 分)
    PTA —— 基础编程题目集 —— 函数题 —— 61 简单输出整数 (10 分)
    练习2.13 不用库函数,写一个高效计算ln N的C函数
    练习2.13 不用库函数,写一个高效计算ln N的C函数
    练习2.13 不用库函数,写一个高效计算ln N的C函数
    迷宫问题 POJ 3984
    UVA 820 Internet Bandwidth (因特网带宽)(最大流)
    UVA 1001 Say Cheese(奶酪里的老鼠)(flod)
    UVA 11105 Semiprime Hnumbers(H半素数)
    UVA 557 Burger(汉堡)(dp+概率)
  • 原文地址:https://www.cnblogs.com/didispace/p/14929825.html
Copyright © 2011-2022 走看看