日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Spring Boot 功能整合的實現(xiàn)

瀏覽:54日期:2023-07-13 16:10:57
目錄前言數(shù)據(jù)庫持久化支持Swagger 文檔支持參數(shù)校驗 JSR303跨域解決整合MongoDB實現(xiàn)文件上傳下載刪除前言

如果根據(jù)之前做的 Nest.js 后端項目功能為標準的話,那么 Spring Boot 項目需要幾種功能進行整合,好在生態(tài)豐富,集成也不算困難。所以打算根據(jù)之前的項目使用 Spring Boot 重寫個新的項目:

Restful API CRUD 功能實現(xiàn) 數(shù)據(jù)庫對象關(guān)系映射功能持久化支持 OpenAPI 文檔支持 參數(shù)校驗判斷業(yè)務 redis 緩存 ... 數(shù)據(jù)庫持久化支持

目前數(shù)據(jù)庫持久化主要是 Spring Boot Jpa 和 Spring Boot Mybatis 。如果看過 JPA 的業(yè)務過程會發(fā)現(xiàn)和 Nodejs 中的 TypeORM 及其相似。Mybatis 主要可以靈活調(diào)試動態(tài) Sql 。不管怎么說根據(jù)自己項目業(yè)務需求選定其中功能吧。

安裝 MyBatis 教程可以官方文檔查閱:mybatis-spring-boot-autoconfigure

Swagger 文檔支持

集成 Swagger UI 文檔支持也非常簡單,生態(tài)中的 springfox 做的不錯,添加依賴:

<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version></dependency>

這里需要指定版本,不指定拉取依賴會報錯。

然后在啟動方法添加注解:

@EnableOpenApipublic class YasuoApplication {public static void main(String[] args) { // ...}}

然后在 Controller 類上添加標識:

@Api(value = 'global', tags = '全局接口')@RestController@RequestMapping('/')public class AppController {}

在然后在方法里添加詳細信息:

@Api(value = 'global', tags = '全局接口')@RestController@RequestMapping('/')public class AppController { UserService userService; @ApiOperation(value = '用戶登錄', notes = '系統(tǒng)用戶登錄') @PostMapping('login') public JSONObject login(@RequestParam('username') String username, @RequestParam('password') String password) {System.out.println(username);System.out.println(password);JSONObject info = new JSONObject();return info; }}

啟動項目訪問:http://localhost:8080/swagger-ui 即可訪問。值得注意是如果你在 application 添加 server.servlet.contextPath 選項的時候記得添加對應的字段。

參數(shù)校驗 JSR303

從 springboot-2.3 開始,校驗包被獨立成了一個 starter 組件:

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

比如在 DTO 類里:

package com.iiong.yasuo.dto;import lombok.Data;import javax.validation.constraints.NotEmpty;/** * Author: Jaxson * Description: 請求用戶登錄參數(shù) * Date: 2021-05-26 */@Datapublic class UserLoginRequestDTO { @NotEmpty(message = '登錄名稱不得為空!') private String username; @NotEmpty(message = '登錄密碼不得為空!') private String password;}

內(nèi)置的校驗注解可以查看官方文檔,然后進行參數(shù)校驗:

@ApiOperation(value = '用戶登錄', notes = '系統(tǒng)用戶登錄')@PostMapping('login')public RestfulModel<UserLoginResponseDTO> login(@RequestBody @Validated UserLoginRequestDTO userLoginRequestDTO) { System.out.println(userLoginRequestDTO); UserLoginResponseDTO userLoginResponseDTO = new UserLoginResponseDTO(); userLoginResponseDTO.setId(1013401346173L); userLoginResponseDTO.setLoginName('112233'); userLoginResponseDTO.setName('系統(tǒng)管理員'); userLoginResponseDTO.setToken('test'); return new RestfulModel<>(0, '登錄成功!', userLoginResponseDTO);}

不過默認返回的異常信息并不是很友好,需要再次簡化,所以需要做個全局異常處理。如果需要可以使用 @RestControllerAdvice 注解來表示全局處理類:

/** * Author: Jaxson * Description: 全局異常處理類 * Date: 2021-05-26 */@ControllerAdvicepublic class ExceptionHandlerConfig { /** * 統(tǒng)一處理參數(shù)校驗異常 * @param bindException 捕捉到的異常 * @return 返回數(shù)據(jù) */ @ExceptionHandler(value = BindException.class) @ResponseBody public RestfulModel<Object> validExceptionHandler(BindException bindException) {String exceptionMsg = bindException.getBindingResult().getAllErrors().get(0).getDefaultMessage();return new RestfulModel<>(1000, exceptionMsg, null); }}

當然這里面還可以處理一些系統(tǒng)級別的異常,自己拋出即可。

跨域解決

解決跨域問題也很簡單,只需要實現(xiàn)接口 WebMvcConfigurer 重寫方法即可:

/** * Author: Jaxson * Description: 運行跨域 * Date: 2021-05-26 */@Configurationpublic class WebMvcConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry corsRegistry) {corsRegistry.addMapping('/**').allowedOriginPatterns('*').allowedHeaders(CorsConfiguration.ALL).allowedMethods(CorsConfiguration.ALL).allowCredentials(true).maxAge(3600); // 1小時內(nèi)不需要再預檢(發(fā)OPTIONS請求) }}整合MongoDB實現(xiàn)文件上傳下載刪除

引入pom依賴

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

配置yml

spring: data: mongodb: host: *.*.*.* username: *** password: *** database: *** port: 27017 # 設(shè)置文件上傳的大小限制 servlet: multipart: max-file-size: 10MB max-request-size: 50MB

上傳下載刪除

/** * @author Mr.Horse * @version 1.0 * @description: MongoDB的文件上傳、下載、刪除等基本操作(集合HuTool工具庫) * @date 2021/4/29 9:53 */@Validated@Controller@RequestMapping('/mongo')public class MongoUploadController { private static Logger logger = LoggerFactory.getLogger(MongoUploadController.class); @Autowired private GridFsTemplate gridFsTemplate; @Autowired private MongoTemplate mongoTemplate; private static final List<String> CONTENT_TYPES = Arrays.asList('image/gif', 'image/jpeg', 'image/jpg', 'image/png'); /** * MongoDB文件上傳(圖片上傳) * * @param file * @return */ @PostMapping('/upload') public ResponseEntity<String> fileUpload(@RequestParam('file') MultipartFile file) {try { // 校驗文件信息(文件類型,文件內(nèi)容) String originalFilename = file.getOriginalFilename(); if (StrUtil.isBlank(originalFilename)) {return ResponseEntity.badRequest().body('參數(shù)錯誤'); } String contentType = file.getContentType(); if (!CONTENT_TYPES.contains(contentType)) {return ResponseEntity.badRequest().body('文件類型錯誤'); } InputStream inputStream = file.getInputStream(); BufferedImage bufferedImage = ImageIO.read(inputStream); if (ObjectUtil.isEmpty(bufferedImage)) {return ResponseEntity.badRequest().body('文件內(nèi)容錯誤'); } // 文件重命名 String suffix = FileNameUtil.getSuffix(originalFilename); String fileName = IdUtil.simpleUUID().concat('.').concat(suffix); // 文件上傳,返回ObjectId ObjectId objectId = gridFsTemplate.store(inputStream, fileName, contentType); return StrUtil.isBlank(String.valueOf(objectId)) ? ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body('文件上傳失敗') : ResponseEntity.ok(String.valueOf(objectId));} catch (IOException e) { return ResponseEntity.badRequest().body('文件上傳異常');} } /** * 根據(jù)ObjectId讀取文件并寫入響應流,頁面進行進行相關(guān)操作,可以進行文件的下載和展示 * * @param objectId */ @GetMapping('/read') public void queryFileByObjectId(@RequestParam('objectId') @NotBlank(message = 'ObjectId不能為空') String objectId, HttpServletResponse response) {// 根據(jù)objectId查詢文件GridFSFile file = gridFsTemplate.findOne(new Query(Criteria.where('_id').is(objectId)));// 創(chuàng)建一個文件桶GridFSBucket gridFsBucket = GridFSBuckets.create(mongoTemplate.getDb());InputStream inputStream = null;OutputStream outputStream = null;try { if (ObjectUtil.isNotNull(file)) {// 打開下載流對象GridFSDownloadStream fileStream = gridFsBucket.openDownloadStream(file.getObjectId());// 創(chuàng)建girdFsResource,傳入下載流對象,獲取流對象GridFsResource gridFsResource = new GridFsResource(file, fileStream);// 寫入輸出流inputStream = gridFsResource.getInputStream();outputStream = response.getOutputStream();byte[] bytes = new byte[1024];if (inputStream.read(bytes) != -1) { outputStream.write(bytes);} }} catch (IOException e) { logger.error('文件讀取異常: {}', e.getMessage());} finally { IoUtil.close(outputStream); IoUtil.close(inputStream);} } /** * 根據(jù)ObjectId刪除文件 * * @param objectId * @return */ @DeleteMapping('/remove') public ResponseEntity<String> removeFileByObjectId(@RequestParam('objectId') @NotBlank(message = 'ObjectId不能為空') String objectId) {gridFsTemplate.delete(new Query(Criteria.where('_id').is(objectId)));return ResponseEntity.ok('刪除成功'); }}

如果需要實現(xiàn)在瀏覽器頁面下載此資源的功能,可結(jié)合js進行操作(文件類型根據(jù)具體業(yè)務需求而定)。主要實現(xiàn)代碼如下所示:

downloadNotes(noteId) { axios({url: this.BASE_API + ’/admin/mongo/file/query/’ + noteId,method: ’get’,responseType: ’arraybuffer’,params: { type: ’download’ } }).then(res => {// type類型可以設(shè)置為文本類型,這里是pdf類型const pdfUrl = window.URL.createObjectURL(new Blob([res.data], { type: `application/pdf` }))const fname = noteId // 下載文件的名字const link = document.createElement(’a’)link.href = pdfUrllink.setAttribute(’download’, fname)document.body.appendChild(link)link.click()URL.revokeObjectURL(pdfUrl) // 釋放URL 對象 }) }

以上就是Spring Boot 功能整合的實現(xiàn)的詳細內(nèi)容,更多關(guān)于Spring Boot 功能整合的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产视频亚洲| 国产日韩1区| 国产69精品久久| 精品视频亚洲| 精品视频国产| 日本久久精品| 国产麻豆久久| 蜜桃国内精品久久久久软件9| 成人羞羞在线观看网站| 久久人人97超碰国产公开结果| 欧美亚洲国产激情| 亚洲一区二区三区四区五区午夜| 伊人久久亚洲| 久久精品99国产精品| 久久亚州av| 欧美经典一区| 国产精品13p| 亚洲精品99| 日韩精品视频在线看| 国产日韩欧美三区| 国产精品成人a在线观看| 蜜桃精品在线| 久久亚洲影院| 国产伦精品一区二区三区视频| 韩日一区二区| 国内激情久久| 婷婷综合福利| 麻豆精品蜜桃视频网站| 久久精品国产亚洲夜色av网站| 午夜在线视频一区二区区别| 日本一区二区中文字幕| 久久精品九色| 欧美一级精品| 91亚洲精品在看在线观看高清| 久久香蕉精品香蕉| 久久精品主播| 日韩欧美精品一区二区综合视频| 国产精品1区在线| 日韩精品dvd| 亚洲图片久久| 老牛国内精品亚洲成av人片| 久久久夜精品| 日韩精品a在线观看91| 久久精品日韩欧美| 亚洲激情偷拍| 欧美亚洲二区| 久久精品导航| 日本不卡高清| 日韩欧美一区免费| 亚洲区欧美区| 亲子伦视频一区二区三区| 亚洲香蕉久久| 国产精品毛片一区二区在线看| 黄色亚洲免费| 精品国产乱码久久久久久樱花| 欧美特黄视频| 精品视频自拍| 亚洲综合福利| 日韩在线短视频| 日本不卡视频在线| 国产美女高潮在线| 日韩在线黄色| 久久人人99| 另类欧美日韩国产在线| 久久都是精品| 日本午夜大片a在线观看| 亚洲精品影视| 欧美日韩一二| 国产成人精品福利| 日韩精品一区二区三区中文字幕| 欧美三级精品| 国产乱码精品一区二区亚洲| 伊人精品视频| 成人综合一区| 国产日韩欧美中文在线| 婷婷成人基地| 中文在线中文资源| 国产精品一区二区三区美女| 亚洲欧美日韩在线观看a三区| 国产盗摄——sm在线视频| 日本不卡视频在线观看| 99成人在线| 神马久久午夜| 国产精品xvideos88| 石原莉奈在线亚洲二区| 久久久久久久久丰满| 精品三级在线观看视频| 日韩精品视频一区二区三区| 欧美日韩国产免费观看| 亚洲综合电影| 午夜电影一区| 每日更新成人在线视频| 国产在线欧美| 色老板在线视频一区二区| 成人一区不卡| 国产精品红桃| 日韩精品成人在线观看| 丝袜美腿一区二区三区| 激情综合在线| 999久久久精品国产| 欧美激情另类| 国产96在线亚洲| 国产一区二区三区91| 国产精品99精品一区二区三区∴ | 亚洲欧美成人综合| 久久精品国产99久久| а√天堂中文在线资源8| 欧美激情视频一区二区三区免费| 日韩精品视频网| 日韩免费精品| 亚洲精品乱码久久久久久蜜桃麻豆 | 老牛国产精品一区的观看方式| 日韩一区三区| 国产一区二区三区久久 | 免费看久久久| 国产欧美精品久久| 国产剧情一区二区在线观看| 日本综合视频| 奇米狠狠一区二区三区| 色综合视频一区二区三区日韩| 丝袜美腿一区二区三区| 亚洲一区二区三区四区五区午夜 | 亚洲三级国产| 亚洲九九精品| 日本久久一区| 日韩高清电影一区| 欧美日韩一区二区三区四区在线观看 | 四虎在线精品| 中文一区一区三区免费在线观| 欧美国产91| 亚洲综合丁香| 亚洲视频电影在线| 欧美亚洲人成在线| 免费一区二区三区在线视频| 狂野欧美性猛交xxxx| 9999国产精品| 99精品视频在线| 尤物在线精品| 日韩中文字幕一区二区高清99| 69堂精品视频在线播放| 欧美aaaaaa午夜精品| 桃色av一区二区| 亚洲国产不卡| 伊人久久大香伊蕉在人线观看热v| 在线看片日韩| 欧美亚洲人成在线| 国内不卡的一区二区三区中文字幕 | 国产欧美一区| 精品视频在线观看网站| 亚洲成人va| 蜜桃av一区| 国产情侣一区| 一本大道色婷婷在线| 中文欧美日韩| 国产日产高清欧美一区二区三区 | 在线日韩中文| 亚洲伊人精品酒店| 国产精品欧美三级在线观看| 91视频精品| 亚洲主播在线| 欧美日韩精品一区二区三区视频 | 日韩欧美中文字幕在线视频| 久久国际精品| 国产麻豆久久| 中文字幕一区二区av| 国产精品久一| 精品日韩视频| 亚洲精选久久| 大香伊人久久精品一区二区 | 日韩激情av在线| 久久中文精品| 1024精品久久久久久久久| 午夜电影一区| 久久影院一区二区三区| 成人羞羞视频在线看网址| 免费国产亚洲视频| 国语对白精品一区二区| 一本一本久久| 麻豆精品视频在线观看| 999视频精品| 欧美日韩va| 99久久婷婷这里只有精品| 日韩精品成人在线观看| 电影天堂国产精品| 日本三级亚洲精品| 欧美1区2区3区| 欧美日一区二区三区在线观看国产免| 亚洲播播91| 日韩激情网站| 91精品亚洲| 亚洲一二av| 日本欧美不卡| 国产精品地址| 中文亚洲免费| 国产一区国产二区国产三区 | 日本v片在线高清不卡在线观看| 天堂中文在线播放| 奇米777国产一区国产二区| 色婷婷狠狠五月综合天色拍| 91精品福利观看|