Spring Boot中擴充套件XML請求和響應實戰
阿新 • • 發佈:2018-12-18
一 點睛
對於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);
}
}
四 測試
五 參考