1. 程式人生 > >Spring Boot中擴充套件XML請求和響應實戰

Spring Boot中擴充套件XML請求和響應實戰

一 點睛

對於XML格式的請求要如何快速的在Controller中包裝成物件,以及如何以XML的格式返回一個物件,被篇將討論這一方面的主題。

二 訊息轉換器

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。

三 實戰

1 新建依賴

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--只需要加入jackson-dataformat-xml依賴,Spring Boot就會自動引入MappingJackson2XmlHttpMessageConverter的實現-->
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

</dependencies>

2 定義物件與Xml的關係

/*
下面定義對應XML為
<User>
    <name>aaaa</name>
    <age>10</age>
</User>
*/
package com.didispace.web;


import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//@Data、@NoArgsConstructor、@AllArgsConstructor是lombok簡化程式碼的註解,主要用於生成get、set以及建構函式。
@Data
@NoArgsConstructor
@AllArgsConstructor
//@JacksonXmlRootElement、@JacksonXmlProperty註解是用來維護物件屬性在xml中的對應關係。
@JacksonXmlRootElement(localName = "User")
public class User {

    @JacksonXmlProperty(localName = "name")
    private String name;
    @JacksonXmlProperty(localName = "age")
    private Integer age;

}

3 控制器

package com.didispace.web;

import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;


@Controller
public class UserController {
    //編寫一個介面來接收xml並返回xml
    @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;
    }

}

4 啟動類

package com.didispace;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import java.util.List;


@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

四 測試

五 參考