SpringBoot?集成Resteasy實現(xiàn)RESTFul接口的詳細過程
- JAX-RS:JavaAPI for RESTful Web Services,JAX-RS是可以用可以用于實現(xiàn)RESTFul應(yīng)用程序的JAVA API,給開發(fā)者提供了一系列的RESTFul注解
- EasyRest:這是Jboss開源的,一款用來定義實現(xiàn)RESTFul應(yīng)用程序的框架,是基于JAX-RS規(guī)范,是JAX-RS API的實現(xiàn)
JAX-RX常用的注解:
@javax.ws.rs.Path // 請求的資源類或資源方法的uri路徑 @javax.ws.rs.GET //表示此方法響應(yīng)HTTP GET請求。 @javax.ws.rs.POST // 表示此方法響應(yīng)HTTP POST請求。 @javax.ws.rs.PUT // 通常用來更新數(shù)據(jù),PUT操作 @javax.ws.rs.DELETE // 通常用來刪除數(shù)據(jù)。 @javax.ws.rs.Produces //設(shè)置Http返回報文,報文體的內(nèi)容類型 @javax.ws.rs.Consumes //客戶端請求的MIME媒體類型 @javax.ws.rs.QueryParam // 一般是GET請求的參數(shù),相當(dāng)于SpringMVC框架的@RequestParam @javax.ws.rs.FormParam // 媒體類型為”application/x-www-form-urlencoded” 的參數(shù) @javax.ws.rs.PathParam // uri中指定的路徑參數(shù)綁定到資源方法參數(shù)
了解了Jboss的Easyrest后,我們通過一個文件上傳的例子來搭建一個RESTFul項目,基于SpringBoot2.0,采用了開源的starter組件resteasy-spring-boot
,GitHub鏈接:https://github.com/resteasy/resteasy-spring-boot
開發(fā)環(huán)境
- SpringBoot2.2.1.RELEASE
- resteasy-spring-boot-starter3.3.2.Final
- JDK1.8
- Maven 3.2+
- resteasy-multipart-provider3…9.1.Final
搭建一個SpringBoot項目
在IDEA里new一個project,這里使用Spring Initializer
快速創(chuàng)建一個SpringBoot項目,Server url可以使用Spring官網(wǎng)的,也可以使用阿里的,然后點擊Next
選擇jdk版本和maven
因為有些jar在start.spring.io
里沒集成,所以需要自己加上,可以參考我的配置,注意,這個resteasy-spring-boot-starter
版本盡量高點,因為要和SpringBoot2.0版本兼容,使用降低版本可能會出現(xiàn)如下問題java.lang.IllegalArgumentException: Could not find class [org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration]
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>springboot-jboss-uploadfile</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-jboss-uploadfile</name> <packaging>jar</packaging> <description>Demo project for Spring Boot</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> <springboot.version>2.2.1.RELEASE</springboot.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>${springboot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!--actuator監(jiān)控 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.1</version> </dependency> <!--resteasy-spring-boot-starter --> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-spring-boot-starter</artifactId> <scope>runtime</scope> <version>3.3.2.Final</version> </dependency> <!-- 文件上傳需要 --> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-multipart-provider</artifactId> <version>3.9.1.Final</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.11</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> <distributionManagement> <repository> <id>jboss-releases-repository</id> <name>JBoss Releases Repository</name> <url>https://repository.jboss.org/nexus/service/local/staging/deploy/maven2/</url> </repository> </distributionManagement> </project>
定義一個JAX-RS的Application類,使用@ApplicationPath
定義根路徑,一定要加@Component
才能被Spring容器掃描到
package com.example.jbossuploadfile.configuration; import org.springframework.stereotype.Component; import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @Component @ApplicationPath("/rest/") public class JAXRSApplication extends Application { }
application.yml配置文件,定義JAXRSApplication
類的路徑
server: port: 8080 spring: main: banner-mode: "off" resteasy: jaxrs: app: registration: property classes: com.example.jbossuploadfile.configuration.JAXRSApplication management: endpoints: web: exposure: include: - health - shutdown endpoint: shutdown: enabled: true logging: level: org: springframework: info
文件上傳例子
然后可以寫一個文件上傳的例子,定義一個返回的實體類
package com.example.jbossuploadfile.entity; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; @Data @Builder @AllArgsConstructor @NoArgsConstructor public class FileUploadResult implements Serializable { private String fileUrl; private Long fileSize; private String fileName; private String fileType; }
使用MultipartFormDataInput
來實現(xiàn)文件上傳,注意客戶端傳入的媒體格式,要定義為MediaType.MULTIPART_FORM_DATA
,也就是form-data
,才能支持文件上傳
package com.example.jbossuploadfile.endpoint; import cn.hutool.core.io.FileUtil; import com.example.jbossuploadfile.entity.FileUploadResult; import lombok.extern.slf4j.Slf4j; import org.jboss.resteasy.plugins.providers.multipart.InputPart; import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput; import org.springframework.stereotype.Component; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Map; @Slf4j @Path("/api") @Component public class FileUploadEndpoint { @Path("/v1/fileUpload") @POST @Produces({MediaType.APPLICATION_JSON}) @Consumes({MediaType.MULTIPART_FORM_DATA}) public FileUploadResult filepload(MultipartFormDataInput formDataInput) throws IOException { String fileName = getFileName(formDataInput , "file"); String fileType = fileName.substring(fileName.lastIndexOf(".")); InputStream inputStream = getInputStream(formDataInput , "file"); File file = FileUtil.writeFromStream(inputStream, new File("D:/server/" + fileName)); long length = file.length(); log.info("fileName : [{}] , fileTye : [{}], size:[{}]" , fileName , fileType , length); return FileUploadResult.builder() .fileName(fileName) .fileUrl(file.getPath()) .fileSize(length) .fileType(fileType).build(); } private InputStream getInputStream(MultipartFormDataInput input, String s) { try { InputStream result; if (input.getParts().size() == 1) { InputPart filePart = input.getParts().iterator().next(); result = filePart.getBody(InputStream.class, null); } else { result = input.getFormDataPart(s, ByteArrayInputStream.class, null); } if (result == null) { throw new IllegalArgumentException("Can't find a valid 'file' part in the multipart request"); } return result; } catch (IOException e) { throw new IllegalArgumentException("Error while reading multipart request", e); } } private String getFileName(MultipartFormDataInput input , String s) { Map<String, List<InputPart>> uploadForm = input.getFormDataMap(); List<InputPart> inputParts = uploadForm.get(s); for (InputPart inputPart : inputParts) { MultivaluedMap<String, String> header = inputPart.getHeaders(); String[] contentDisposition = header.getFirst("Content-Disposition").split(";"); for (String filename : contentDisposition) { if ((filename.trim().startsWith("filename"))) { String[] name = filename.split("="); String finalFileName = name[1].trim().replaceAll("\"", ""); return finalFileName; } } } return "unknown"; } }
在Postman里測試一下,注意使用form-data
方式
到此這篇關(guān)于SpringBoot 集成Resteasy實現(xiàn)RESTFul接口的文章就介紹到這了,更多相關(guān)SpringBoot RESTFul接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談Java內(nèi)存模型之happens-before
于存在線程本地內(nèi)存和主內(nèi)存的原因,再加上重排序,會導(dǎo)致多線程環(huán)境下存在可見性的問題。那么我們正確使用同步、鎖的情況下,線程A修改了變量a何時對線程B可見?下面小編來簡單介紹下2019-05-05SpringBoot參數(shù)校驗的最佳實戰(zhàn)教程
開發(fā)過程中,后臺的參數(shù)校驗是必不可少的,下面這篇文章主要給大家介紹了關(guān)于SpringBoot參數(shù)校驗的最佳實戰(zhàn),文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2021-08-08詳解java WebSocket的實現(xiàn)以及Spring WebSocket
這篇文章主要介紹了詳解java WebSocket的實現(xiàn)以及Spring WebSocket ,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-01-01myeclipse安裝Spring Tool Suite(STS)插件的方法步驟
這篇文章主要介紹了myeclipse安裝Spring Tool Suite(STS)插件的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08JDBC中使用Java8的日期LocalDate和LocalDateTime操作mysql、postgresql
這篇文章主要給大家介紹了關(guān)于JDBC中如何使用Java8的日期LocalDate和LocalDateTime的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09Java基礎(chǔ)學(xué)習(xí)之IO流應(yīng)用案例詳解
這篇文章主要為大家詳細介紹了Java?IO流的三個應(yīng)用案例:點名器、集合到文件和文件到集合,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2022-09-09java中實現(xiàn)map與對象相互轉(zhuǎn)換的幾種實現(xiàn)
這篇文章主要介紹了java中實現(xiàn)map與對象相互轉(zhuǎn)換的幾種實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07