最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot?集成Resteasy實(shí)現(xiàn)RESTFul接口的詳細(xì)過程

 更新時(shí)間:2023年08月21日 10:33:31   作者:smileNicky  
這篇文章主要介紹了SpringBoot集成Resteasy實(shí)現(xiàn)RESTFul接口,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
  • JAX-RS:JavaAPI for RESTful Web Services,JAX-RS是可以用可以用于實(shí)現(xiàn)RESTFul應(yīng)用程序的JAVA API,給開發(fā)者提供了一系列的RESTFul注解
  • EasyRest:這是Jboss開源的,一款用來定義實(shí)現(xiàn)RESTFul應(yīng)用程序的框架,是基于JAX-RS規(guī)范,是JAX-RS API的實(shí)現(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返回報(bào)文,報(bào)文體的內(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后,我們通過一個(gè)文件上傳的例子來搭建一個(gè)RESTFul項(xiàng)目,基于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

搭建一個(gè)SpringBoot項(xiàng)目

在IDEA里new一個(gè)project,這里使用Spring Initializer快速創(chuàng)建一個(gè)SpringBoot項(xiàng)目,Server url可以使用Spring官網(wǎng)的,也可以使用阿里的,然后點(diǎn)擊Next

在這里插入圖片描述

選擇jdk版本和maven

在這里插入圖片描述

因?yàn)橛行﹋ar在start.spring.io里沒集成,所以需要自己加上,可以參考我的配置,注意,這個(gè)resteasy-spring-boot-starter版本盡量高點(diǎn),因?yàn)橐蚐pringBoot2.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>

定義一個(gè)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

文件上傳例子

然后可以寫一個(gè)文件上傳的例子,定義一個(gè)返回的實(shí)體類

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 來實(shí)現(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實(shí)現(xiàn)RESTFul接口的文章就介紹到這了,更多相關(guān)SpringBoot RESTFul接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 23種設(shè)計(jì)模式(12)java模版方法模式

    23種設(shè)計(jì)模式(12)java模版方法模式

    這篇文章主要為大家詳細(xì)介紹了23種設(shè)計(jì)模式之java模版方法模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Java實(shí)現(xiàn)從Word文檔中提取文本和圖像

    Java實(shí)現(xiàn)從Word文檔中提取文本和圖像

    在 Java 開發(fā)項(xiàng)目中,處理 Microsoft Word 文檔是常見場景,例如,內(nèi)容管理系統(tǒng)需要批量解析文檔文本用于搜索索引,數(shù)據(jù)遷移工具需分離圖像以便獨(dú)立存儲,本文介紹如何借助 Spire.Doc for Java 庫實(shí)現(xiàn)這一功能,需要的朋友可以參考下
    2026-03-03
  • Java基礎(chǔ)之八大排序算法

    Java基礎(chǔ)之八大排序算法

    這篇文章主要介紹了Java基礎(chǔ)之八大排序算法,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • SpringBoot注冊Servlet的三種方法詳解

    SpringBoot注冊Servlet的三種方法詳解

    這篇文章主要介紹了SpringBoot注冊Servlet的三種方法詳解,教你如何Spring Boot 注冊 Servlet、Filter、Listener,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05
  • Spring Boot2深入分析解決java.lang.ArrayStoreException異常

    Spring Boot2深入分析解決java.lang.ArrayStoreException異常

    這篇文章介紹了Spring Boot2深入分析解決java.lang.ArrayStoreException異常的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • 詳解spring cloud分布式關(guān)于熔斷器

    詳解spring cloud分布式關(guān)于熔斷器

    這篇文章主要介紹了詳解spring cloud分布式關(guān)于熔斷器,詳細(xì)的介紹了什么是熔斷器和使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • 詳解在java中進(jìn)行日期時(shí)間比較的4種方法

    詳解在java中進(jìn)行日期時(shí)間比較的4種方法

    這篇文章主要介紹了詳解在java中進(jìn)行日期時(shí)間比較的4種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java jpa外連接查詢join案例詳解

    Java jpa外連接查詢join案例詳解

    這篇文章主要介紹了Java jpa外連接查詢join案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 解決mybatisPlus 中的field-strategy配置失效問題

    解決mybatisPlus 中的field-strategy配置失效問題

    這篇文章主要介紹了解決mybatisPlus 中的field-strategy配置失效問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java測試框架Mockito的簡明教程

    Java測試框架Mockito的簡明教程

    這篇文章主要介紹了Java測試框架Mockito的簡明教程,Mock 測試是單元測試的重要方法之一。本文介紹了基于 Java 語言的 Mock 測試框架 – Mockito 的使用。,需要的朋友可以參考下
    2019-06-06

最新評論

买车| 拜城县| 天津市| 嘉善县| 大竹县| 红河县| 丹江口市| 太谷县| 金坛市| 溧水县| 黑河市| 江城| 灵寿县| 上思县| 石城县| 闵行区| 泾川县| 轮台县| 宜昌市| 定远县| 库尔勒市| 宜宾县| 江门市| 广昌县| 济阳县| 化德县| 文山县| 上栗县| 文成县| 旬阳县| 弋阳县| 大厂| 乌兰县| 昭觉县| 嘉兴市| 张家川| 剑川县| 义乌市| 简阳市| 临城县| 恩施市|